打印
[开发资料]

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

[复制链接]
638|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近一直在居家办公,原本对居家办公还心存一丝幻想,想着把一天的工作提前做完,就可以留给自己更多的空间。
然而,当真正居家办公,才体会到其中的心塞与无奈,客户、售后电话的轮番轰炸、同事经常找不到人......等诸多问题,可把我给整麻了图片
下面进入正文:

1!!操作

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

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

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

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

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

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

语法形式 : !(条件)


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

语法形式 : !!(条件)


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

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

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

前提是你要自己能看懂。

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

<p>!!(false) == false</p><p>!!(非false) == true</p>


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

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


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

offset = len/64 + 1;


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

但个人觉得,尽量还是不要操作:

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

使用特权

评论回复
沙发
小夏天的大西瓜|  楼主 | 2023-12-16 12:03 | 只看该作者
2还有个用处

最早看到这种处理方式是在判断一个引脚的高底电平上:
u8GPIOLevel = !!(GPIOA_Data &  PIN_2);


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

使用特权

评论回复
板凳
jf101| | 2023-12-19 09:54 | 只看该作者
!!的使用方法听好的,第一次见到

使用特权

评论回复
地板
AdaMaYun| | 2023-12-19 09:58 | 只看该作者
!在C语言中叫逻辑非运算符,是一种条件运算符。

使用特权

评论回复
5
LOVEEVER| | 2023-12-19 10:04 | 只看该作者
!!其实就是值本身

使用特权

评论回复
6
OKAKAKO| | 2023-12-19 10:12 | 只看该作者
~是按位取反确实容易与!弄混

使用特权

评论回复
7
forgot| | 2023-12-19 10:15 | 只看该作者
负负得正吗

使用特权

评论回复
8
小小蚂蚁举千斤| | 2023-12-19 10:38 | 只看该作者
其实就是基础!应用

使用特权

评论回复
9
中国龙芯CDX| | 2023-12-21 09:08 | 只看该作者
~是按位取反,跟!确实不一样的

使用特权

评论回复
10
星辰大海不退缩| | 2023-12-21 12:31 | 只看该作者
这个操作是不是有点怪异呢?

使用特权

评论回复
11
szt1993| | 2023-12-22 12:13 | 只看该作者
双重否定标肯定的意义是什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

206

主题

1815

帖子

2

粉丝