根据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
我做错了什么?
i
正在递增,但不是在用作数组访问器之前。 要获得您正在寻找的内容,请尝试使用 ++i
。 (前缀而不是后缀。)
您可以用另一种方式看待这个问题:
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
“i++”的意思是, “使用增量之前的变量值作为表达式结果,但增量变量”。
“++i”的意思是“增加变量,并使用增加后的值作为结果”。
首先完成增量。但是,
i++
会递增 i
并返回旧值的副本。正如其他人提到的,要获得所需的行为,请使用 ++i
,它会递增 i
并返回对 i
的引用。