0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中两个感叹号的作用是什么

Dp1040 来源:鱼鹰谈单片机 2023-12-04 11:02 次阅读

今天更新一篇小短文,希望对你有帮助。


int func(int temp){return!!temp;}

不知道你是否看过上面类似的代码,两个感叹号出现在代码中,难道代码也有思想,也需要表达情感吗?

刚学习 C语言的时候,你应该经常看到过 1 个感叹号的情况,比如:


if(one!=two){.......}-----------------------------------------if(!temp){......}-----------------------------------typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;-----------------------------------------one=!temp;

但两个感叹号估计就很难见到了。

鱼鹰大学四年、工作三年都没见过这种写法,直到前段时间看 Linux 源码,才接触到,第一次看到时非常惊讶,怎么还有这种写法?

为什么要用两个感叹号,作用是什么,只是为了表现 C 语言的奇技淫巧吗?

仔细想过后才惊叹其中的巧妙。

假设一个字节变量 byte,可代表范围 0~255,0 代表其中一种含义,1 ~255 代表另一种含义(你可能会问,怎么不直接用 0 和 1 表示,因为这个变量本身不只有 0 和 1,只是在另一个使用的地方才会只使用二值含义,总之会有这种情况)。

如果我要用另一个变量 bit 来表示这两种含义,一般情况我们会这么做:


int func(unsigned char byte){ unsigned char bit; if(byte==0){bit=0;}else{ bit = 1;}return bit;}

更优雅简单一点是这样写:


int func(unsigned char byte){bit=byte?1:0; return bit;}

但不管哪一个,都不如第一个简单高效。

简单可以很容易看出来,高效何在?

它不需要判断语句(判断语句在单片机中可能影响不是很大,但在有多级缓存的情况下,影响可能很大,这就是为什么 linux 中用 likely() 之类的进行优化)。

这样,不管原先的byte 是什么值,都将变成 0 或1

这样一来,如果调用者使用如下方式:


if(func() == 1){}或者 if(func()){ }

都不会出现问题。

对于负数也是如此,只要是为了把 0 单独分开,都可以采用这种方式。

这在底层开发中也非常实用。

比如 GPIO 有个引脚号需要判断是 0 或 1,一般这样:


bit=(GPIOB->IDR&GPIO_Pin_4) >> 4;

或者bit=(GPIOB->IDR&GPIO_Pin_4)? 1 : 0;

上一种确实也是不错的选择,但是这里需要修改两个地方,修改时很容易遗忘,所以不如下面这种简单:


bit=!!(GPIOB->IDR&GPIO_Pin_4);

如果换个 IO ,需要修改代码时,只要修改一次就搞定,相当方便,所以建议大家使用上面那种方式获取位的值。

而从汇编的角度来看,两次 ! 也只需要一条指令搞定:

253a80d8-923d-11ee-939d-92fbcf53809c.png

效率不输移位方式!

本文转载自鱼鹰谈单片机

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11120

    浏览量

    207854
  • C语言
    +关注

    关注

    180

    文章

    7574

    浏览量

    133908
  • 源码
    +关注

    关注

    8

    文章

    625

    浏览量

    28961
  • 代码
    +关注

    关注

    30

    文章

    4665

    浏览量

    67743

原文标题:7 年了,没见过代码中出现过两个感叹号

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    wifi旁边有感叹号, 显示无internet是怎么回事?

    Wi-Fi 旁边的感叹号,应该表示:已连接到 AP(ESP8266),但是 AP 无法访问互联网 吧?
    发表于 07-09 08:13

    MAX里面的USB6009 OEM出现感叹号

    MAX里面的USB6009 OEM出现感叹号:我采用了自检以及重启设备,但是都没有用,我的自校检是灰色的,用不了。不知还有其它什么办法呢?
    发表于 12-16 09:32

    cadence画原理图出现黄色感叹号

    请问cadence画电路原理图时出现黄色感叹号是什么原因?
    发表于 07-12 09:05

    keil5新建工程图标上出现感叹号

    请教大神,DEVICE下面的stm32f10x_conf.h文件和RTE_Components.h文件图标上出现感叹号,不知道什么情况 ,有没有哪位知道的
    发表于 10-26 08:34

    STM32F103做USB虚拟两个串口时有一在设备管理器上是黄色感叹号

    各位好!我在做USB虚拟成两个串口时,安装好驱动程序,一串口可以使用另外一串口 在设备管理器上是黄色感叹号。不知道有没有遇到此情况。
    发表于 01-21 07:18

    硬件串口变成黄的感叹号

    :硬件串口变成黄的感叹号了。卸了pl2303驱动也不行。删了串口自动装驱动时sernume.sys时,始终装不上,那位大侠知道原因?
    发表于 05-15 22:46

    为什么AD10界面右下角总是出现一感叹号

    ad10应该是破解成功了,如图:AD10界面右下角总是出现一感叹号:怎么解决呢??
    发表于 08-02 04:38

    UDE-STK在设备管理器中显示黄色感叹号

    UDE-STK 在设备管理器中显示黄色感叹号,然后无法正常使用是什么情况?之前在其他电脑上用过是正常可以使用的,换了台电脑重新安装就显示黄色感叹号,无法用了怎么回事呢?在线急等,请各位大神指教!!!谢谢谢谢
    发表于 12-05 08:30

    驱动装好后总是有感叹号的解决办法?

    如题怎么解决,驱动装好后总是有感叹号,怎么办,我的电脑是win10的,驱动支持吗?
    发表于 07-27 02:32

    kindle显示电池感叹号

    现象如标题,可以通过百度 “kindle显示电池感叹号” 去看百度经验。对于长期未使用的kindle,应该有电池保护程序,无法进行充电,需要先激活电池。主要步骤和上面一样,在个人进行测试的时候,发现
    发表于 09-15 08:41

    使用CUBE时有些外设引脚出现黄色感叹号怎么解决

    本人使用CUBE时遇到的问题引脚配置时,有些外设引脚出现黄色感叹号,有些引脚变红色,如图: 分析:我去百度找了下,有网友也 出现过此类问题,被告知是出现黄色感叹号说明 部分引脚不可用了(被占
    发表于 02-28 13:35

    RT-Thread Studio工程文件带有感叹号这个是怎么一回事

    RT-Thread Studio 工程文件带有感叹号,这个是怎么一回事,如何去除感叹号
    发表于 11-30 10:11

    kindle开不机怎么办?kindle开不了机屏幕电池感叹号

    应该挺多人都遇到过kindle没电了充电一直显示感叹号的问题,遇到kindle没电了充电一直显示感叹号的问题时不要慌,下面小编为大家带来几个解决kindle没电了充电一直显示感叹号的方法。 很多人都
    的头像 发表于 06-04 11:27 4.8w次阅读

    如何给C语言中的函数定义两个不同的名字?

    最近有位哥问我,如何给C语言中的函数定义两个不同的名字?就是这两个名字都是指向同一函数,同一
    的头像 发表于 12-19 16:21 552次阅读

    电脑通用串行总线控制器感叹号怎么办

    控制器感叹号时,通常表示USB控制器存在问题,可能是驱动程序问题、硬件故障或其他原因导致的。本文将介绍如何解决电脑通用串行总线控制器感叹号的问题。 检查USB设备 首先,我们需要检查连接到电脑的USB设备是否存在问题。尝试断开所有USB设备,然后重新启动电脑,查看通用串行
    的头像 发表于 08-29 15:53 405次阅读