8

在 C 中模拟布尔值可以这样完成:

int success;
success = (errors == 0 && count > 0);
if(success)
   ...

包含stdbool.h以下内容可以完成:

bool success;
success = (errors == 0 && count > 0) ? true : false;
if(success)
   ...

据我了解,逻辑和比较运算符应返回 1 或 0。此外,stdbool.h应定义常量,以便true == 1false == 0.

因此以下应该工作:

bool success;
success = (errors == 0 && count > 0);
if(success)
   ...

它确实适用于我测试过的编译器。但是假设它是可移植代码是否安全?(假设stdbool.h存在)

由于 bool 是内部类型,C++ 编译器的情况是否有所不同?

4

3 回答 3

15

假设是安全的。在 C99 中,在转换为_Bool类型后,所有非零值都将转换为 1。这在 C99 标准的第 6.3.1.2 节中进行了描述。等式和关系运算符(例如==,>=等)也保证会产生 1 或 0。这在第 6.5.8 节和第 6.5.9 节中进行了描述。

对于 C++,该bool类型是真正的布尔类型,其中值被转换为true或而不是 1 或 0,但是将操作等false的结果分配给 a 并期望它工作仍然是安全的,因为关系和比较运算符结果无论如何。当转换为整数类型时,它会转换为 1。==boolbooltrue

于 2013-02-01T08:17:17.603 回答
3

该表达式(errors == 0 && count > 0)具有 type bool,并且可以在bool需要 a 的任何地方使用,包括将其分配给 type 的变量bool,或在条件中使用它。(当转换为另一种整数类型时,false转换为 0 和true1,但在您的代码中没有问题。)

请注意,在 C 中,带有<stdbool.h>,bool的行为应该与在 C++ 中的行为完全相同(尽管由于各种历史原因,实际规范有所不同)。这意味着类似:

bool success = (errors == 0 && count > 0) ? true : false;

不是真正想写的东西。该表达式errors == 0 && count > 0具有与 兼容的类型bool,并且可以用作类型的表达式 bool。(当然,在 C++ 中,类型不仅与 兼容 bool,还与bool.)

于 2013-02-01T08:50:04.750 回答
1

stdbool.h这是我系统上的多汁部分:

#define bool    _Bool
#if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int     _Bool;
#endif

#define false   0
#define true    1

C99 具有_Bool内置类型,它将所有非零值转换为 1(如前所述)。但是,快速浏览一下我的stdbool.h演示,即使没有 C99,也可以安全地假设这些东西可以使用一个警告,即不等于 0分配给 a的值_Bool不会转换为 1(_Bool因为一个简单的inttypedef 而不是具有特殊属性的内置类型),因此不会== true.

于 2013-02-01T08:39:10.720 回答