此转换的可移植性如何。我可以确定两个断言都通过了吗?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
不要问为什么。我知道这很难看。谢谢。
答案 0 :(得分:173)
int x = 4<5;
完全便携。符合标准。 bool
到int
转换是隐含的!
如果源类型为bool,则值
false
将转换为零, 值true
转换为一个。
至于C,据我所知,C中没有bool
(1999年之前),因此bool
到int
转换仅与C ++相关。在C中,4<5
评估为int
值,在这种情况下,值为1
,4>5
将评估为0
。
编辑:评论中的Jens说,C99有_Bool
类型。 bool
是stdbool.h
头文件中定义的宏。 true
和false
也是stdbool.h
中的宏定义。
宏
bool
扩展为_Bool。[..]
true
扩展为整数常量1
,false
它扩展为整数常量0
,[..]
答案 1 :(得分:44)
您同时标记了您的问题[C]和[C ++]。结果将在语言之间保持一致,但每种语言的答案结构都不同。
在C语言中,您的示例与bool
无关(也适用于C99)。在C语言中,关系运算符不会产生bool
个结果。 4 > 5
和4 < 5
都是表达式int
的结果,其值为0
或1
。因此,在C中的示例中没有任何类型的“bool to int conversion”。
在C ++中,关系运算符确实会产生bool
个结果。 bool
值可转换为int
类型,true
转换为1
,false
转换为0
。这是由语言保证的。
P.S。 C语言也有一个专用的布尔类型_Bool
(宏名称为bool
),其整数转换规则与C ++中的基本相同。但是,这与您在C中的具体示例无关。再次,无论语言规范的版本如何,C中的关系运算符始终生成int
(而非bool
)结果。
答案 2 :(得分:17)
C标准第6.5.8.6节说:
每个运营商&lt; (小于),&gt; (大于),&lt; =(小于或等于 to),&gt; =(大于或等于) 如果指定,则应收1 关系是真,如果是,则为0 false。)结果的类型为int。
答案 3 :(得分:2)
似乎没有问题,因为int to bool cast是隐式完成的。这适用于Microsoft Visual C ++,GCC和Intel C ++编译器。在C或C ++中没问题。