C 投给布尔:`!!`vs`(bool)`

C 投给布尔:`!!`vs`(bool)`,c,casting,boolean,C,Casting,Boolean,使用有什么不同吗!!x与(bool)x 假设\uuu STDC\u版本=199901L和\35;包括 它们是否都能保证结果是0或1,并且无论x的大小和值如何,都不会发生溢出!!x(在C语言中,不是C++)具有类型int(bool)x(包括)具有类型\u bool。 虽然\u Bools可以很快升级为ints,但这两种代码可以从\u Generic中区分出来 !!x(或等效的0!=x)将始终是0或1,(bool)x将始终是(bool)0或(bool)1,如果它编译(=不违反任何约束)并且定义了x,

使用
有什么不同吗!!x
(bool)x

假设
\uuu STDC\u版本=199901L
\35;包括

它们是否都能保证结果是
0
1
,并且无论
x
的大小和值如何,都不会发生溢出!!x(在C语言中,不是C++)具有类型
int
<代码>(bool)x(包括
)具有类型
\u bool
。 虽然
\u Bool
s可以很快升级为
int
s,但这两种代码可以从
\u Generic
中区分出来

!!x
(或等效的
0!=x
)将始终是
0
1
(bool)x
将始终是
(bool)0
(bool)1
,如果它编译(=不违反任何约束)并且定义了
x
,它将始终是定义良好的

表达式溢出,如
!!x+INT_MAX
(bool)x+INT_MAX
bool
升级为
INT
)仍然令人担忧


参考资料:

:(_Bool)x(_Bool)(0!=x)

1当任何标量值转换为_Bool时,如果 值等于0;否则,结果为1.59)

( ,--标量是数值类型或指针

整数和浮点类型统称为算术类型。

算术类型和指针类型统称为标量 类型。。。 )

:!!x0=x

逻辑求反运算符的结果!如果其 操作数比较不等于0,如果其操作数的值比较为1 等于0。结果的类型为int。表达式为!E是等价的 到(0==E)


请同时回答问题的第二部分,这对大多数用例来说也是最重要的。@Cacahuetferito OK
(bool)x
是bool的真实状态(如果x为非零),但这与
1
bool有两种状态并不完全相同,你可以随意调用它们,但我希望能清楚我指的是哪一种状态“真正的州”。标准没有给州的官方名称表达式
while(x)/*…*/;
while(!!x)/*…*/;
,和
while(_Bool)x)/*…*/;
是等价的。我更喜欢第一个。if的
的条件部分是相同的。它更适合于当您出于某种原因实际需要数字
1
时。
(bool)2==1
是真的,因为整数提升需要
(bool)2
(int)1