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语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146167
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74384

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在Keil中进行C代码与汇编代码的混合编程

    1. 在 C 代码中调用汇编程序代码C 代码中调用汇编程序中函数的方法: 第一步,在 C
    发表于 01-23 06:36

    讲解C语言代码的实现过程

    重点讲解C语言代码的实现过程,算法的C语言实现过程具有一般性,通过PID算法的C语言实现,可以以此类推,设计其它算法的C语言实现。 第一步:
    发表于 01-21 07:58

    c语言中的代码优化

    写好的代码嵌入到当前程序,不会产生函数调用,因此仅仅是占用了空间,在频繁调用同 一个宏的时候,该现象尤为突出。 举例以下: 方法C: #define bwMCDR2_ADDRESS 4
    发表于 01-12 09:45

    CS32L010系列能否支持串口的发送和接收中断单独配置?不同中断的中断优先级如何设置?

    1、串口能否配置成阻塞式发送和中断式接收。 2、不同中断的中断优先级如何设置?我在开启中断函数代码中看到说中断优先级配置需要先调用NVIC_PriorityGroupConfig()函数,但此函数无定义,全局搜索不到。
    发表于 12-10 18:46

    如何使用 ADC 测量电阻式触摸的准确值?

    ://github.com/opennuvoton/m480bsp 2. 解压文件并打开它,我们可以从示例代码文件夹中看到一个 NuMaker-PFM-M487D 的文件夹。 您应该会看到两个项目,一个是
    发表于 09-05 07:01

    rt-thread studio 编辑代码时,使用ctrl+c复制代码会闪退怎么解决?

    rt-thread studio 编辑代码时,使用ctrl+c复制代码会闪退?
    发表于 08-29 06:36

    为什么当微控制器(MCU)用作I2C从机时,I2C_SCL连续接收数据时会出现时钟拉伸?

    为什么当微控制器(MCU)用作I2C从机时,I2C_SCL连续接收数据时会出现时钟拉伸?
    发表于 08-26 08:05

    为什么当微控制器 (MCU) 用作 I2C 从机时,I2C_SCL在接收连续数据时会出现时钟拉伸?

    为什么当微控制器 (MCU) 用作 I2C 从机时,I2C_SCL在接收连续数据时会出现时钟拉伸
    发表于 08-21 06:32

    Perforce QAC产品简介:面向C/C++的静态代码分析工具(已通过SO 26262认证)

    Perforce QAC专为C/C++开发者打造,支持多种编码规范、功能安全标准(ISO 26262)等,广泛用于汽车、医疗、嵌入式开发领域,可帮助快速识别关键缺陷、提升代码质量、实现合规交付。
    的头像 发表于 07-10 15:57 1464次阅读
    Perforce QAC产品简介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++的静态<b class='flag-5'>代码</b>分析工具(已通过SO 26262认证)

    请问在CYBLE-333074-EVAL-M2B中SPI应使用哪些引脚?

    您好,我正在使用模块 CYBLE-333074-EVAL-M2B ,我在数据表中看到可以使用 SPI,我想通过 SPI 将模块 CYBLE-333074-EVAL-M2B 与外部闪存通信 ,您能
    发表于 07-02 06:13

    使用 CY4500 EZ-PD 协议分析器实用程序来调试USB类型C应用程序,无法在 “详细信息” 窗口中找到 \" HPD 状态\"怎么解决?

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

    FX2 I2C代码挂起的原因?

    逻辑分析仪中看到 SCL 和 SDA)。 当我将MULTICH_CONNECT_PCB SDL 线连接到 ESP8266 时,代码挂起。 说明 ; 1. 连接正确 . 2. FX2 KIT_A2G_TC387_MOTORCTR在 SCL 和 SDA 线上都有上拉 (2.2
    发表于 05-26 08:09

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

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

    fx3 uvc uart组合代码在usb 2.0中不起作用怎么解决?

    大家好,需要帮助/建议, 我已经在 fx3 中将 uvc 和 cdc(uart)代码组合在一起。 但是当我连接 USB 3.0 电缆时,我只能在 Windows 中看到 Fx3 和 COM 端口
    发表于 05-15 07:32

    深入理解C语言:C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于
    的头像 发表于 04-29 18:49 2225次阅读
    深入理解<b class='flag-5'>C</b>语言:<b class='flag-5'>C</b>语言循环控制