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