强制转换为bool:`!!`vs`(bool)`

时间:2019-03-02 12:50:14

标签: c casting boolean

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

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

它们是否都保证结果是01,并且无论x的大小和值如何,都不会发生溢出?

1 个答案:

答案 0 :(得分:7)

!!x(在C中,不是C ++)的类型为int(bool)x(包括<stdbool.h>)的类型为_Bool。 尽管_Bool很快就可以晋升为int,但可以将两者分开_Generic内部来区分。

!!x(或等效的0!=x)将始终为01,而(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.5p186.2.5p21-标量是数字类型或指针

  

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

     

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

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

  

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