用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
)
C ++编译器的情况是否不同,因为bool是内部类型?
答案 0 :(得分:14)
可以安全地假设。在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。
答案 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 ++中,类型不仅仅兼容
bool
,bool
。)
答案 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
。