使用!!xvs 有什么区别(bool)x吗?
假设__STDC_VERSION__ >= 199901L和#include <stdbool.h>
他们两个都保证结果是0或者1,并且没有溢出发生,无论大小和价值是x多少?
!!x(在C中,而不是C++)有类型int.(bool)x(<stdbool.h>包括在内)有类型_Bool.虽然_Bools很快被提升为ints,但是这两者可以在内部被告知_Generic.
!!x(或等效的0!=x)总是要么0或1和(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).