问题描述
在下面的代码中,输出为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
是否已隐式更改为布尔值?
不。相反,布尔表达式已隐式转换为int
,然后存储到i
中,如@WhozCraig所述。
如何为这样的表达式设置整数值?
因为它遵循C ++标准。
操作时:
i = b < a < c;
因为第一个<
和第二个<
具有相同的运算符优先级(因为它们是相同的运算符),所以:
如C++ Operator Precedence中所述具有相同优先级的运算符绑定到其参数 在他们的联系的方向。例如,表达式a = b = c被解析为a =(b = c),而不是(a = b)= c,因为赋值从右到左,但是解析了a + b-c(a> + b)-c而不是a +(b-c),因为加法和减法从左到右具有关联性。
,这意味着您的表达式将被解析为就像这样写:
i = (b < a) < c;
将评估括号内的条件,即False。
现在bool
到int
的转换是隐式的:
§4.7/ 4说(整体转换)
如果源类型为bool,则值
>false
转换为零,值true
转换为一。
这意味着将false转换为0,然后我们基本上结束了:
i = 0 < c;
其结果为true,因为c
等于1。现在i
的类型为int
,这意味着最终发生了另一个从布尔值到整数的第二次隐式转换。将1分配给i
。