为什么C++编译器在这个简单的程序中不给予优先权(赋值下的自增运算符)?

问题描述 投票:0回答:4

根据C/C++语言运算符优先级表(参见维基百科),自增运算符(++)优先于赋值运算符(=)。

有人可以解释一下为什么编译器首先在这个简单的程序中赋值(bill[x] 中的 1),然后增加索引值(i++)。我觉得应该是相反的(先增加再赋值):

#include <iostream>
using namespace std;

int bill[] = {16, 17, 18, 19, 20};

int main ()
{
  int i = 3;

  bill[(i++)] = 1; // I think it should be bill[4] = 1;

  cout << bill[0] << endl;
  cout << bill[1] << endl;
  cout << bill[2] << endl;
  cout << bill[3] << endl;
  cout << bill[4] << endl;

  cout << "Index value:" << i << endl;

  return 0;
}

输出为:

16
17
18
1
20
Index value:4

我做错了什么?

c++ compiler-construction operators operator-precedence
4个回答
7
投票

i
正在递增,但不是在用作数组访问器之前。 要获得您正在寻找的内容,请尝试使用
++i
。 (前缀而不是后缀。)


4
投票

您可以用另一种方式看待这个问题:

bill[(++i)] = 1;

您可以将其理解为,先递增“i”,然后执行语句。

bill[(i++)] = 1;

您可以将其理解为,首先执行语句,然后递增“i”。

如果您想知道这是如何实现的,可以像这样实现内部后增量以获得您所看到的行为:

int post_increment(int &i)
{
  int t = i;
  i = i + 1;
  return t;
}

bill[post_increment(i)] = 1;    // access bill[3] even though i == 4

与预增量相比,如下所示:

int pre_increment(int &i)
{
  i = i + 1;
  return i;
}

bill[pre_increment(i)] = 1;    // access bill[4] where i == 4

1
投票

“i++”的意思是, “使用增量之前的变量值作为表达式结果,但增量变量”。

“++i”的意思是“增加变量,并使用增加后的值作为结果”。


1
投票

首先完成增量。但是,

i++
会递增
i
并返回旧值的副本。正如其他人提到的,要获得所需的行为,请使用
++i
,它会递增
i
并返回对
i
的引用。

© www.soinside.com 2019 - 2024. All rights reserved.