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

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

3天内不再提示

C代码中看到连续“!!”

Q4MP_gh_c472c21 来源:最后一个bug 作者:bug菌 2022-04-24 09:41 次阅读

最近一直在居家办公,原本对居家办公还心存一丝幻想,想着把一天的工作提前做完,就可以留给自己更多的空间。

然而,当真正居家办公,才体会到其中的心塞与无奈,客户、售后电话的轮番轰炸、同事经常找不到人......等诸多问题,可把我给整麻了

进入正片:

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);

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

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

    关注

    180

    文章

    7596

    浏览量

    136007
  • 代码
    +关注

    关注

    30

    文章

    4733

    浏览量

    68282

原文标题:C代码中看到"!!",捻了把汗~

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

收藏 人收藏

    评论

    相关推荐

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的 C 语言代码在结构和表达上存在巨大的
    的头像 发表于 09-02 10:37 1321次阅读

    C2000 DCSM ROM代码片段/ROP漏洞

    电子发烧友网站提供《C2000 DCSM ROM代码片段/ROP漏洞.pdf》资料免费下载
    发表于 08-28 09:39 0次下载
    <b class='flag-5'>C</b>2000 DCSM ROM<b class='flag-5'>代码</b>片段/ROP漏洞

    在XTR111的手册中看到静态功耗的值,想请问下工作时的功耗如何计算?

    在XTR111的手册中看到静态功耗的值,想请问下工作时的功耗如何计算?谢谢。
    发表于 08-14 06:11

    SDK 0.9.4在函数中连续调用espconn_sent,只能看到第一个espconn_sent的数据,为什么?

    在 SDK 0.9.3 及更早版本中,如果我在函数中连续调用 espconn_sent,它将发送所有连接的数据。如果我在 0.9.4 中执行相同的操作,我只能看到第一个espconn_sent的数据
    发表于 07-18 08:24

    请问esp32c2支持ADC连续转换模式的功能吗?

    请问esp32c2支持ADC连续转换模式的功能吗,我看官网的API没有这部分的代码,下了连续转换的例子,选c2芯片编译时也报相关API没对应
    发表于 06-06 08:15

    CYW20829在CySmart中看到的芯片或淡蓝色的BLE地址不符,为什么?

    wiced_bt_set_local_bdaddr 或通过以下方式致电并打印出 BDA 地址 wiced_bt_dev_read_local_addr( bda ); 与我在 CySmart 中看到
    发表于 05-24 07:14

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    将MULTICH_CONNECT_PCB SDL线连接到ESP8266时,代码挂起的原因?

    逻辑分析仪中看到 SCL 和 SDA)。 当我将MULTICH_CONNECT_PCB SDL 线连接到 ESP8266 时,代码挂起。 说明 ; 1. 连接正确 . 2. FX2
    发表于 03-05 07:21

    当CY7C65215在两个通道上配置为SPI和I2C时,能否在Linux系统中看到两个设备?

    我的客户想知道,当CY7C65215 在两个通道上配置为 SPI 和 I2C 时,他能否在 Linux 系统中看到两个设备。
    发表于 03-05 06:52

    CY4500怎样才能在详细信息窗口中看到 \" HPD 状态\"解码结果行?

    ;quot; HPD 状态"。 我怎样才能在详细信息窗口中看到 " HPD 状态"解码结果行?
    发表于 02-23 07:21

    BQ3588C_代码下载

    BQ3588C_代码下载
    的头像 发表于 01-10 15:09 484次阅读

    请问能用I2C读取ADXL345连续的几个寄存器吗?

    在实际的操作过程中发现,不能使用I2c读取ADXL345连续的几个寄存器(0x32-0x37),看到论坛里有说明SPI可以,我在这里想问问专业的工程师I2C可以做到吗?虽然可以使用da
    发表于 01-02 08:05

    C语言代码的常用技巧

    #和##对于大部分C语言玩得还算比较溜的朋友并不是很陌生,不过能把这两个知识点游刃有余的应用到所在代码中的每个角落,似乎并没有几个人能够做到,学的时候朗朗上口,而编码的时候却抛之脑后。
    的头像 发表于 12-05 09:25 517次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>代码</b>的常用技巧

    c语言怎么把代码全部注释掉

    要将C语言代码全部注释掉,即不让代码被编译和执行,可以使用注释语句来实现。C语言提供两种注释方式:单行注释和多行注释。 单行注释:使用双斜杠(//)来注释一行
    的头像 发表于 11-22 10:21 6570次阅读

    如何写出高效优美的C语言代码

    电子发烧友网站提供《如何写出高效优美的C语言代码.pdf》资料免费下载
    发表于 11-18 10:55 0次下载
    如何写出高效优美的<b class='flag-5'>C</b>语言<b class='flag-5'>代码</b>