Why the C++ compiler does not give precedence (increment operator under assignment) in this simple program?

和自甴很熟 提交于 2019-12-10 15:30:25

问题


According to the table of precedence of operators in C/C++ language (see Wikipedia), the increment operator (++) takes precedence with respect to the assignment operator (=).

Can someone explain why the compiler first assign the value (1 in bill[x]) and then increases the index value (i++) in this simple program. I think it should be the opposite (first increase and then assign):

#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;
}

The output is:

16
17
18
1
20
Index value:4

I'm doing something wrong?


回答1:


Another way you can look at this:

bill[(++i)] = 1;

You can read it as, increment 'i' first then do the statement.

bill[(i++)] = 1;

You can read it as, first do the statement then increment 'i'.

If you're wondering how this is possible, internally post-increment can be implemented like this to get the behavior you're seeing:

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

vs pre-increment which looks like this:

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

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



回答2:


i is being incremented, but not before it is used as the array accessor. To get what you're looking for, try `++i' instead. (Prefix instead of postfix.)




回答3:


"i++" means, "use as the expression result, the variable value before the increment, but increment the variable".

"++i" means, "increment the variable, and use the incremented value as the result".




回答4:


The increment is being done first. However, i++ increments i and returns a copy of the old value. As others have mentioned, to get the desired behaviour, use ++i, which increments i and returns a reference to i.



来源:https://stackoverflow.com/questions/8380960/why-the-c-compiler-does-not-give-precedence-increment-operator-under-assignme

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!