使用!!x
与(bool)x
有什么区别吗?
假设__STDC_VERSION__ >= 199901L
和#include <stdbool.h>
它们是否都保证结果是0
或1
,并且无论x
的大小和值如何,都不会发生溢出?
答案 0 :(得分:7)
!!x
(在C中,不是C ++)的类型为int
。 (bool)x
(包括<stdbool.h>
)的类型为_Bool
。
尽管_Bool
很快就可以晋升为int
,但可以将两者分开_Generic
内部来区分。
!!x
(或等效的0!=x
)将始终为0
或1
,而(bool)x
将始终为(bool)0
或{ {1}},如果它可以编译(=不违反任何约束)并且已定义(bool)1
,那么它将总是定义良好。
x
或!!x+INT_MAX
((bool)x+INT_MAX
升为bool
)之类的表达式中的溢出仍然是一个问题。
参考文献:
6.3.1.2:(_ Bool)x <=>(_Bool)(0!= x)
1如果将任何标量值转换为_Bool,则如果结果为0,则结果为0。 值比较等于0;否则结果为1.59)
( 6.2.5p18,6.2.5p21-标量是数字类型或指针
整数和浮点类型统称为算术类型。 ...
算术类型和指针类型统称为标量 类型。 ... )
6.5.3.3p5:!! x <=> 0!= x
逻辑否定运算符的结果!如果其值是0 如果操作数的值比较,则操作数比较不等于0、1 等于0。结果的类型为int。表达式!E是等效的 到(0 == E)。