条件赋值为布尔值
在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 == 1
和false == 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
类型是一个真正的布尔类型,其中值转换为true
或false
而不是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
。