C 为什么要用!!(条件)而不是(条件)?
我见过一些代码,其中人们使用带有两个'!'的条件子句C 为什么要用!!(条件)而不是(条件)?,c,logical-operators,C,Logical Operators,我见过一些代码,其中人们使用带有两个'!'的条件子句 #define check_bit(var, pos) (!!((var) & (1 << (pos)))) #define likely(x) __builtin_expect(!!(x),1) #define unlikely(x) __builtin_expect(!!(x),0) #define check_bit(var,pos)(!!((var)和(1它强制转换为布尔值,这有时
#define check_bit(var, pos) (!!((var) & (1 << (pos))))
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
#define check_bit(var,pos)(!!((var)和(1它强制转换为布尔值,这有时是有用的。我能看到的最大问题是,它将强制(或规范化)值转换为1
或0
(即布尔值),而不管x
或var
表达式如何扩展(例如char
或double
或int
等)。如果您应用的变量!!
不是bool
(零或一),那么它将把值标准化为0
或1
关于\u内置\u expect
,本文讨论了符号,其中一个回答解释了(重点是我的):
“内置”expect的签名
)是:
长内置预期(长扩展,长c)
请注意,exp参数应该是一个整数表达式,因此没有指针
或浮点类型。双反运算处理从
这些类型将自动转换为整数表达式。这样,您可以
写入:可能(ptr)而不是可能(ptr!=NULL)
C99bool
宏扩展为\u bool
,true
扩展为1
,false
扩展为0
。详细信息见标准草案部分7.16
布尔类型和值
逻辑求反包含在第5段中的6.5.3.3
一元算术运算符中:
如果操作数的值比较,则逻辑求反运算符!的结果为0
不等于0,如果其操作数的值比较等于0,则为1。结果的类型为int。
表达式!E等价于(0==E)
一元!
逻辑求反运算符应用于任何标量,如果其操作数为非零,则产生int
值0
,如果操作数等于零,则产生1
。引用标准:
表达式!E
相当于(0==E)
对同一标量值应用两次!
,如果该值为false,则生成的结果为false;如果该值为true,则生成的结果为true——但结果将分别标准化为0
或1
在大多数情况下,这是不必要的,因为任何标量值都可以直接用作条件。但在某些情况下,实际上需要0
或1
值
在C99或更高版本中,将表达式强制转换为\u Bool
(如果您有\include
,则将表达式强制转换为Bool
),其行为类似,可能会被认为更清晰。但是(a)结果的类型为\u Bool
,而不是int
,以及(b)如果你使用的是一个不支持<代码>前BoOL < /C>的C99编译器,你已经定义了自己的<代码> BoOL 类型,它的行为将不像C99的<代码> > BoOL 。< /P>这是C而不是C++——没有布尔值。C没有一个本源布尔类型吗?.h
最初C没有布尔类型,因此人们习惯于使用int
表示布尔值,并将整数(在int
中)转换为“布尔值”(在int
中)@Siidheesh\u Bool
是本机类型。另请参阅、、以及更多…哦,伙计,很抱歉!@Siidheesh这取决于您的搜索方式,我最初的搜索也没有显示它们,但后来做了一些轻微的修改。我个人没有发现任何DUP像我发现的内核新手线程那样击中了头部因此,对于那块金块来说,这可能是值得的。基思的解释也比DUP中的大多数其他解释好得多,但他通常都能写出很好的答案。是的,寻找双重否定就成功了