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

906debf167df050fdcfdd559ff196750.gif

正文


大家周末好,我是bug菌~

最近一直在居家办公,原本对居家办公还心存一丝幻想,想着把一天的工作提前做完,就可以留给自己更多的空间;然而当真正居家办公,才体会到其中的心塞与无奈,客户、售后电话的轮番轰炸、同事经常找不到人......等诸多问题,可把我给整麻了。

进入正片:

1

!!操作

看到交流群里有朋友抛出一段C语言操作:

offset = len/64 + !!(len%64);

这两个连续的感叹号把有些人给整蒙圈了,还有些朋友调侃道: !!表示语气加重,事情非常紧急得尽快处理,可把我给整笑了。

其实都是常规操作吧,只是这样的写法在正常的编码过程中并不多见。

首先这两个!!并不是什么C语言新的关键字,而是!运算符的嵌套作用。

!在C语言中叫逻辑非运算符,是一种条件运算符。

语法形式 : !(条件)

其中的条件如果是false,则最终整个表达式为true;反之则为false,bug菌提醒一句:要与~进行区分,~是按位取反,很多初学者容易混淆。

语法形式 : !!(条件)

所以如上表达式就是两个!的嵌套形式。

当然如果你想项目代码中变得无可替代,可以继续如下操作:

语法形式 : !!!......!!(条件)

前提是你要自己能看懂。

那么回到!!,该操作所达到的效果便是条件逻辑与最终表达式的逻辑结果保持一致:

!!(false) == false
!!(非false) == true

而对于大部分编译器false对应的是0,而true对应的是1,所以很多同志拿着逻辑结果参与数值运算。

offset = len/64 + !!(len%64);

该表达式的用处也非常清楚了,当len不能被64整除,则:

offset = len/64 + 1;

获得正确的数据分组个数,这代码应该是来源于存储或者通信中。

但bug菌觉得,尽量还是不要操作:

逻辑和数值运算最好是分开,以增加代码的可读性和可移植性。

2

还有个用处

最早看到这种处理方式是在判断一个引脚的高底电平上:

u8GPIOLevel = !!(GPIOA_Data &  PIN_2);

!!在其中的作用跟之前是一样的,使得表达式的数据结果与条件中的逻辑保持一致,便可以直接获得结果。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

最后一个bug,bug菌唯一创作平台~

ad0d988d75836d6afa9226ddd283f876.png

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 40d64f04c63511aaa3fd896c04452ea6.gif

☞  嵌入式C语言进阶专辑 490ef208059ac9fcb016bc85098e8b39.gif

☞  “bug说”专辑 b95e106e3bffa0c6c83b5eb90cfd45bd.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

120c6bcf5060b0ae26bce9c56f8a9402.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值