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

    文章

    7513

    浏览量

    124066
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66487

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

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

收藏 人收藏

    评论

    相关推荐

    将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

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

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

    多通道放大器中看到了crosstalk的指标,这是怎么测量的呢?

    你好,请问一下我在很多多通道放大器中看到了crosstalk的指标,我想问一下这是怎么测量的呢?(例如ADI的MAX40242)
    发表于 11-13 07:37

    MBD的Simulink使用技巧:详解代码生成中的模型与代码(2)

    上一篇文章中提到,生成嵌入式代码,必须选择定步长求解器。实际中,生成嵌入式代码几乎不会使用Simulink模型库中的连续模型,往往需要通过最简单的离散模块来实现算法模型。
    的头像 发表于 07-13 15:13 2723次阅读
    MBD的Simulink使用技巧:详解<b class='flag-5'>代码</b>生成中的模型与<b class='flag-5'>代码</b>(2)

    在级联模式下配置抽取滤波器,无法在TAP寄存器中看到任何值是怎么回事?

    我正在尝试在级联模式下配置抽取滤波器,Block A 和 B 的基本配置已完成。ADC 触发基地。我已将 ACR1 配置为将 ADC 结果发送到滤波器块而不是 RFIFO,转换命令根据 ACR1 使用备用配置命令进行更新。我仍然无法在 TAP 寄存器中看到任何值。
    发表于 05-25 07:38

    做一个带有2个节点MCU板的基本光控制器,代码根本不起作用的原因?

    我正在做一个带有 2 个节点 MCU 板的基本光控制器。 在主循环中,我决定在有阳光的情况下使用深度睡眠功能。我将使用一些带有 LDR 的外部函数来唤醒单片机。 然而,当我在 IDE 中尝试这个想法时,代码根本不起作用。代码如下。我没有在硬件或串行监视器
    发表于 05-19 13:03

    在文档中看到core0可以触发core1的中断,是否有使用此方法的演示?

    您好,在文档中看到core0可以触发core1的中断。是否有使用此方法的演示?
    发表于 05-16 08:48

    可以从u-boot看到sdcard,但它不会出现在linux中的原因?

    我有一个定制的 imx8mn 板,我正在尝试让 sdcard 工作。我可以在 u-boot 中看到它,但它不会在 linux 中探测。
    发表于 05-12 08:18

    MQTT发布新消息时代码中的回调函数如何继续执行?

    关于我用来通过 WiFi 和 MQTT 打开和关闭设备的代码,我实际上有三个问题。根据我在 Arduino IDE 中看到的情况,MQTT 正在反复连接和重新连接。在我看来,这应该只发生一次。 另外
    发表于 05-12 07:11

    可以让MC33771C保持连续的睡眠/唤醒周期?

    除非发生错误,否则是否可以让 MC33771C 保持连续的睡眠/唤醒周期? 我可以看到它在选定的时间(例如 8 秒)内休眠,然后在测量周期内醒来。 即使设置了所有唤醒掩码(禁用),MC33664 也会有一个唤醒脉冲 (TPL)。
    发表于 05-06 07:58

    使用IMX8M-Mini evk板并尝试配置usb uvc小工具驱动程序,为什么无法在/sys/class/udc中看到任何节点?

    我正在使用 IMX8M-Mini evk 板并尝试配置 usb uvc 小工具驱动程序。但是我无法在 /sys/class/udc 中看到任何节点。 你能帮忙做些有需要的事吗?
    发表于 04-17 07:19

    esp32 devkitc连接到USB到安装在面包板,无法再获得OLED输出或在Thonny中看到任何输出的原因?

    IDE 查看控制台。上运行的 esp32 (我不确定 USB 电缆是否持续发送正确的电压,想看看我是否可以让它运行几天左右),所以我只是拔掉电源并远离 FTDI 并将它们移到面包板电源上。但是,我无法再获得 OLED 输出或在 Thonny 中看到任何输出(我的电脑可以看到
    发表于 04-12 07:05

    如何通过i2c连续读写eeprom?

    我用verilog自制了一个i2c模块,将电路下载到fpga中,在读写eeprom时出现问题,不能连续读写,如果单独读写一个字节,即随机读写一个字节功能是正常的,连续读写和随机读写有什么区别?
    发表于 03-29 10:22