首页 > 解决方案 > 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;
}

标签: c++c++17

解决方案


是否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


推荐阅读