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是否已隐式更改为布尔值?

不。相反,布尔表达式已隐式转换为int,然后存储到i中,如@WhozCraig所述。

如何为这样的表达式设置整数值?

因为它遵循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。

现在boolint的转换是隐式的:

C ++标准的

§4.7/ 4说(整体转换)

如果源类型为bool,则值 false 转换为零,值 true 转换为一。

>

这意味着将false转换为0,然后我们基本上结束了:

i = 0 < c;

其结果为true,因为c等于1。现在i的类型为int,这意味着最终发生了另一个从布尔值到整数的第二次隐式转换。将1分配给i

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...