自增运算符-前加加-后加加
1. 下面的代码输出是什么?
int main()
{
int a[2] = {0, 0};
int *p = a;
*(p++) = 1;
cout << a[0] << a[1] << endl;
system("PAUSE");
}
{
int a[2] = {0, 0};
int *p = a;
*(p++) = 1;
cout << a[0] << a[1] << endl;
system("PAUSE");
}
结果是10,即a[0]=1,a[1]=0。虽然有括号,但是仍旧是没有先对p进行自增,实际上,自增的步骤是发生在该符号所在的表达式结束之后。即*(p++)=1;相当于*p=1; p++;
2. 下面的代码输出是什么?
int main()
{
int A = 1;
cout << (A++)*(A++)*(A++)*(A++) << endl;
A = 1;
cout << (++A)*(++A)*(++A)*(++A) << endl;
{
int A = 1;
cout << (A++)*(A++)*(A++)*(A++) << endl;
A = 1;
cout << (++A)*(++A)*(++A)*(++A) << endl;
system("PAUSE");
}
}
前者输出1,后者输出180。
对于后加加,(A++)*(A++)*(A++)*(A++)相当于A*A*A*A;A++;A++;A++;A++; 即为1*1*1*1=1
对于前加加,想当然的话,先四次加加,再乘法,会是5*5*5*5=625,而结果是180。其实前加加更加复杂一些:
· 首先,计算(++A)*(++A),相当于++A;++A; A* A;
· 然后,乘第三个因子,相当于++A; 已有结果*A;
· 最后,乘第四个因子,相当于++A; 已有结果*A。
· 即3*3*4*5=180。
3. 总结
对于后加加,加加操作都在表达式之后进行。
对于前加加,加加操作都在表达式之前进行,但是会考虑表达式内部的结合顺序,即考虑子表达式的问题,进行逐步加加的。
4. 存疑
虽然从程序上验证了,本文的说法,网上也有一些人说是这样,不过“前加加”与“后加加”在表达式内部的结合上对待是不同的,为什么会对“后加加”考虑子表达式,对“前加加”不考虑,还不是很清楚。
编译工具DEV C++,对于VC6.0,参考的文章中有人也验证过可以,对于其他编译器,不能保证。
5. 参考
C 语言自增自减运算符深入剖析 http://www.bhcode.net/article/20110226/15159.html