它返回2
。
“通常的算术转换”应用于运算符的操作数==
。_Bool
是转换等级低于int
or的无符号类型unsigned int
。
“通常的算术转换”在C99或C11标准的第 6.3.1.8 节“通常的算术转换”中指定(链接是最近的草案)。
在i == b
中,由于没有浮点操作数,因此“整数提升”适用于两个操作数,将右操作数从_Bool
to 提升int
并产生 value 1
。现在两个操作数属于同一类型,因此不需要进一步转换。Soi == b
等价于42 == 1
,这是错误的。
在(_Bool)i == b
中,“整数提升”仍然适用于两个操作数,因此两者都从 转换_Bool
为int
。(从int
to_Bool
和 back to的转换int
会丢失信息,将所有非零值转换为1
。)现在两个操作数的类型相同,因此不需要进一步的转换。So(_Bool)i == b
等价于1 == 1
,这是真的 - 并且函数返回2
。
(注意:由于我在阅读标准时有些粗心,这是关于此答案的第三次主要编辑。我想这次我做对了。)
在回答评论中的问题时,将fromb == 42u
提升为,从而进行比较。由于操作数具有不同的符号但相同的转换等级,因此将有符号的操作数转换为无符号类型。从to转换是微不足道的,产生. 所以比较等价于,这是错误的。b
_Bool
int
int
unsigned int
1
int
unsigned int
1u
1u == 42u
(请注意,==
C 中的运算符与其他等式和关系运算符一样,会产生int
带有值0
or的类型结果1
,而不是类型的结果_Bool
。)