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