【C语言】【逻辑非】双感叹号的用法

简介: 【C语言】【逻辑非】双感叹号的用法

关于!的用法温习


经典如是说


  • 《C Programming Language》


  • By definition,the numeric value of a relational or logical expression is 1 if the relation is true,and 0 if the relation is false.The unary negation operator converts a non-zero operand into 0, and a zero operand in 1.


  • 《ISO/IEC 9899:201x》


The result of the logical negation operator ! is 0 if the value of its operand compares


unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.


The expression !E is equivalent to (0==E).


简而言之


以!(cond)为例来说明:


  • 取非运算,将cond和0比较;


  • 结果为int类型的值;


例子


- if  (flag)    # flag为非0,则if条件判断为真
- if (!flag)    # flag为0,  则if条件判断为真


关于!!(cond)


!!的含义


  • !!(cond)等价于!(!cond),进行两次!运算,所以具体值如下面表格所示:


v/op ! !!
0 1 0
1(nonzero) 0 1


也即:


!!(0) = 0
   !!(1) = 1
   !!(nonzero) = 1


!!的例子


#define IS_CAP_OF_XXX_FUNC (0x0000 0100)
INT32 cap = 0;
INT32 isSupportXXX = 0;
cap = get_chip_capability(); #读取芯片能力集
isSupportXXX = !!(cap & IS_CAP_OF_XXX);  #为1表示支持XXX功能,0表示不支持XXX功能;


实际,!!只是缩短了代码行数,用if判断可达到同样的目的。

相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
1月前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
168 2
|
3月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
80 1
|
5月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
5月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
5月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
79 2
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
C语言
C语言中的赋值运算、比较运算和逻辑运算详解
C语言中的赋值运算、比较运算和逻辑运算详解
102 0
|
5月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法