使用!!x
与使用(bool)x
有什么区别吗?
假设__STDC_VERSION__ >= 199901L
并且使用了#include <stdbool.h>
它们两个都保证结果为0
或1
,无论x
的大小和值如何,也不会发生溢出吗?
!!x
(在C中,不是C ++)的类型为int
。(bool)x
(包含<stdbool.h>
)的类型为_Bool
。
虽然_Bool
很快就会提升为int
,但两者可以从_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不相等,则为1,如果其操作数的值与0相等。结果具有int类型。表达式! E等效于(0 == E)。
(bool)x
is the true state of bool (if x is nonzero), but that's not exactly the same as1
- M.Mwhile(x) /*...*/;
,while(!!x) /*...*/;
和while((_Bool)x) /*...*/;
是等价的。我更喜欢第一个。对于if
和for
的 condition 部分也是如此。 - pmg1
的情况。 - alx - recommends codidacttrue == 1
。我不确定的是(bool)2 == 1
是否成立。 - alx - recommends codidact(bool)2 == 1
is true, because the integer promotions take(bool)2
to(int)1
- M.M