c++ - c++中值比较的结果
问题描述
在下面的代码中,输出为 1,但我不知道为什么。我是否已隐式更改为布尔值?如何将整数值设置为这样的表达式?
#include <iostream>
using namespace std;
int main (int argc, const char *argv[])
{
int a = 1, b = 1, c = 1, i = 1;
i = b < a < c;
cout << i;
return 0;
}
解决方案
是否
i
已隐式更改为布尔值?
不会。正如@WhozCraig 所评论的那样,布尔表达式已被隐式转换为int
,然后存储在 中。i
如何将整数值设置为这样的表达式?
因为它遵循 C++ 标准。
当你这样做时:
i = b < a < c;
因为第一个<
和第二个<
具有相同的运算符优先级(因为它们是相同的运算符),所以:
具有相同优先级的运算符在它们的关联性方向上绑定到它们的参数。例如,表达式 a = b = c 被解析为 a = (b = c),而不是 (a = b) = c,因为赋值的从右到左关联性,但 a + b - c 被解析(a > + b) - c 而不是 a + (b - c),因为加法和减法的从左到右的关联性。
如C++ Operator Precedence中所述,这意味着您的这个表达式将被解析,就好像它是这样写的:
i = (b < a) < c;
这将评估括号内的条件,即 False。
现在bool
转换int
是隐式的:
C++ 标准的第 4.7/4 节说(积分转换)
如果源类型为 bool,则将值
false
转换为 0,并将值true
转换为 1。
这意味着false将被转换为0,然后我们基本上结束了:
i = 0 < c;
它的计算结果为真,因为c
等于 1。 Nowi
是 类型int
,这意味着发生了另一个从布尔到整数的隐式转换,最终将 1 分配给i
。