将其转换为布尔型:`!!`和`(bool)`哪个更好?

3

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

假设__STDC_VERSION__ >= 199901L并且使用了#include <stdbool.h>

它们两个都保证结果为01,无论x的大小和值如何,也不会发生溢出吗?


(bool)x is the true state of bool (if x is nonzero), but that's not exactly the same as 1 - M.M
布尔类型有两种状态,你可以随便称呼它们,但我希望“真实状态”是清楚的。标准没有给这些状态官方名称。 - M.M
表达式 while(x) /*...*/;while(!!x) /*...*/;while((_Bool)x) /*...*/; 是等价的。我更喜欢第一个。对于 ifforcondition 部分也是如此。 - pmg
1
这更多地适用于你实际需要数字1的情况。 - alx - recommends codidact
@M.M 好的,我重新读了你的评论,现在我明白了。是我自己的错。然而,标准确实保证 true == 1。我不确定的是 (bool)2 == 1 是否成立。 - alx - recommends codidact
1
(bool)2 == 1 is true, because the integer promotions take (bool)2 to (int)1 - M.M
1个回答

7

!!x(在C中,不是C ++)的类型为int(bool)x(包含<stdbool.h>)的类型为_Bool。 虽然_Bool很快就会提升为int,但两者可以从_Generic内部区分开来。

!!x(或等效的0!= x)将始终是01(bool)x将始终是(bool)0(bool)1,如果它编译(不违反任何约束)且定义了x,则始终定义良好。

表达式中的溢出,例如!!x+INT_MAX(bool)x+INT_MAXbool提升为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)。


请回答问题的第二部分,这也是大多数用例中最重要的部分。 - alx - recommends codidact
@CacahueteFrito 好的 - Petr Skocik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接