布尔到int转换
这种转换的便携性 我能确定这两个断言都通过了吗?
int x = 4<5; assert(x==1); x = 4>5; assert(x==0);
不要问为什么。 我知道这是丑陋的。 谢谢。
int x = 4<5;
完全便携。 标准符合。 bool
到int
转换是隐式的!
C ++标准中的§4.7/ 4说(积分转换 )
如果源types是bool,则将值
false
转换为零 ,并将值true
转换为一个值。
至于C,据我所知C中没有bool
(1999年以前)所以bool
到int
转换只与C ++有关。 在C中, 4<5
评估为int
值,在这种情况下,值为4>5
评估为0
。
编辑:Jens在评论中说,C99有_Bool
types。 bool
是一个在stdbool.h
头文件中定义的macros。 true
和false
也是在stdbool.h
macros定义的。
C99的§7.16说,
macros
bool
扩展到_Bool。[…]
true
扩展到整数常量1
,false
扩展到整数常量0
,[..]
您同时标记了您的问题[C]和[C ++]。 结果在语言之间是一致的,但是这些语言的答案结构是不同的。
在C语言中,你的例子与bool
无关(也适用于C99)。 在C语言中,关系运算符不会产生bool
结果。 4 > 5
和4 < 5
都是生成值为0
或1
int
型结果的expression式。 所以,在你的例子中没有任何types的“布尔转换”
在C ++中,关系运算符确实产生了bool
结果。 bool
值可转换为int
types,其中true
转换为1
, false
转换为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 ++都没有问题。