条件赋值为布尔值

在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 ++编译器的情况是否不同?

可以安全地假设。 在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。

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

请注意,在C中,使用bool应该与C ++中的行为完全相同(尽管由于各种历史原因,实际规范是不同的)。 这意味着:

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

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

这是我系统上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