条件赋值为布尔值

时间:2013-02-01 08:11:58

标签: c++ c

用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

C ++编译器的情况是否不同,因为bool是内部类型?

3 个答案:

答案 0 :(得分:14)

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

对于C ++,bool类型是一种真正的布尔类型,其中值转换为truefalse而不是1或0,但分配结果仍然是安全的对==进行bool操作等并希望它能够正常工作,因为关系运算符和比较运算符无论如何都会产生bool。当true转换为整数类型时,它将转换为1。

答案 1 :(得分:2)

表达式(errors == 0 && count > 0)的类型为bool,并且 可以在需要bool的任何地方使用,包括分配 它为bool类型的变量,或在条件中使用它。 (当转换为另一个整数类型时,false转换为0, 和true到1,但在您的代码中毫无疑问。)

请注意,在C中,使用<stdbool.h>bool应该表现出来 就像它在C ++中一样(尽管对于各种历史 原因,实际规格不同)。这意味着 类似的东西:

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

真的是你想写的东西。该 表达式errors == 0 && count > 0的类型是 与bool兼容,可用作类型的表达式 bool。 (当然,在C ++中,类型不仅仅兼容 boolbool。)

答案 2 :(得分: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的情况下,也可以安全地假设这些内容适用于一个值不等于零的值一个分配给_Bool转换为1(因为_Bool是一个简单的int typedef而不是具有特殊属性的内置类型)因此不会== true