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)

C99
bool
宏扩展为
\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中的大多数其他解释好得多,但他通常都能写出很好的答案。是的,寻找双重否定就成功了