自增运算符-前加加-后加加

1. 下面的代码输出是什么?    

int main() 
{
   
int a[2= {00};
   
int *= 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;
   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

posted @ 2011-08-09 22:48  xiaodongrush  阅读(2869)  评论(3编辑  收藏  举报