谷动谷力

 找回密码
 立即注册
查看: 818|回复: 0
打印 上一主题 下一主题
收起左侧

C代码中看到"!!",捻了把汗

[复制链接]
跳转到指定楼层
楼主
发表于 2023-5-22 23:34:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C代码中看到"!!",捻了把汗


前段时间,看到交流群里有人抛出一段C语言操作:
offset = len/64 + !!(len%64);这两个连续的感叹号把有些人给整蒙圈了,还有些朋友调侃道: !!表示语气加重,事情非常紧急得尽快处理,可把我给整笑了。其实都是常规操作吧,只是这样的写法在正常的编码过程中并不多见。首先这两个!!并不是什么C语言新的关键字,而是!运算符的嵌套作用。!在C语言中叫逻辑非运算符,是一种条件运算符。
语法形式 : !(条件)
其中的条件如果是false,则最终整个表达式为true;反之则为false。这里提醒一句:要与~进行区分,~是按位取反,很多初学者容易混淆。
语法形式 : !!(条件)
所以如上表达式就是两个!的嵌套形式。当然如果你想项目代码中变得无可替代,可以继续如下操作:语法形式 : !!!......!!(条件)前提是你要自己能看懂。那么回到!!,该操作所达到的效果便是条件逻辑与最终表达式的逻辑结果保持一致:
!!(false) == false
!!(非false) == true
而对于大部分编译器false对应的是0,而true对应的是1,所以很多同志拿着逻辑结果参与数值运算。
offset = len/64 + !!(len%64);
该表达式的用处也非常清楚了,当len不能被64整除,则:
offset = len/64 + 1;
获得正确的数据分组个数,这代码应该是来源于存储或者通信中。但我觉得,尽量还是不要操作:逻辑和数值运算最好是分开,以增加代码的可读性和可移植性。除此之外,它还有个用处,最早看到这种处理方式是在判断一个引脚的高底电平上:
u8GPIOLevel = !!(GPIOA_Data &  PIN_2);
!!在其中的作用跟之前是一样的,使得表达式的数据结果与条件中的逻辑保持一致,便可以直接获得结果。
作者:bug菌
来源:最后一个bug


+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-28 09:44 , Processed in 0.095078 second(s), 41 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表