演员布尔:`!!`vs`(bool)`

Cac*_*ito 3 c casting boolean

使用!!xvs 有什么区别(bool)x吗?

假设__STDC_VERSION__ >= 199901L#include <stdbool.h>

他们两个都保证结果是0或者1,并且没有溢出发生,无论大小和价值是x多少?

PSk*_*cik 7

!!x(在C中,而不是C++)有类型int.(bool)x(<stdbool.h>包括在内)有类型_Bool.虽然_Bools很快被提升为ints,但是这两者可以在内部被告知_Generic.

!!x(或等效的0!=x)总是要么01(bool)x将永远是任一(bool)0(bool)1,如果它编译(=不违反任何约束)和x被定义,它都会被很好的定义.

!!x+INT_MAX(bool)x+INT_MAX(bool升级int)这样的表达式溢出仍然是一个问题.


参考文献:

6.3.1.2:(_ Bool)x <=>(_ Bool)(0!= x)

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

( 6.2.5p18,6.2.5p21 -标量是数字类型或指针

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

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

6.5.3.3p5:!! x <=> 0!= x

逻辑否定运算符的结果!如果其操作数的值比较不等于0则为0;如果其操作数的值比较等于0则为1.结果的类型为int.表达式!E等价于(0 == E).