布尔到int转换

这种转换的便携性 我能确定这两个断言都通过了吗?

int x = 4<5; assert(x==1); x = 4>5; assert(x==0); 

不要问为什么。 我知道这是丑陋的。 谢谢。

 int x = 4<5; 

完全便携。 标准符合。 boolint转换是隐式的!

C ++标准中的§4.7/ 4说(积分转换

如果源types是bool,则将值false转换为零 ,并将值true转换为一个值。


至于C,据我所知C中没有bool (1999年以前)所以boolint转换只与C ++有关。 在C中, 4<5评估为int值,在这种情况下,值为4>5评估为0

编辑:Jens在评论中说,C99有_Booltypes。 bool是一个在stdbool.h头文件中定义的macros。 truefalse也是在stdbool.hmacros定义的。

C99的§7.16说,

macrosbool扩展到_Bool。

[…] true扩展到整数常量1false扩展到整数常量0 ,[..]

您同时标记了您的问题[C]和[C ++]。 结果在语言之间是一致的,但是这些语言的答案结构是不同的。

在C语言中,你的例子与bool无关(也适用于C99)。 在C语言中,关系运算符不会产生bool结果。 4 > 54 < 5都是生成值为01 int型结果的expression式。 所以,在你的例子中没有任何types的“布尔转换”

在C ++中,关系运算符确实产生了bool结果。 bool值可转换为inttypes,其中true转换为1false转换为0 。 这是由语言保证的。

PS C语言也有一个专用的布尔types_Bool (macro-aliased as bool ),其整型转换规则基本上与C ++中的相同。 但是,这与你在C中的具体例子无关。再一次,C中的关系运算符总是产生int (而不是bool )结果,而不pipe语言规范的版本如何。

C标准的6.5.8.6节说:

如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)应为1,如果为假)。结果有typesint。

似乎没有问题,因为int到布尔转换是隐式完成的。 这适用于Microsoft Visual C ++,GCC和Intel C ++编译器。 C或C ++都没有问题。