在学习指针的时候,碰到了printf语句,并且里面常常有何自加,自减运算连用。经过尝试,得到一些结论,不知正确与否。
1.不论在TC,VC6.0还是VS2008中,printf语句是自右向左执行的。
2.具体的编译器会有不同的理解方式,应尽量避免这样的写法。
下面是从网上找的一个例子(来源:http://hi.baidu.com/tonydelwee/blog/item/2e683a1aa31320e9af5133c6.html)
在VC++6.0中的规则如下:
1、i遇到了就直接使用 ;
2、++i先加1,再使用加过1的i;
3、i++先使用i,再加1,但是要在整条语句结束以后才自加1。
printf("%d,%d,%d,%d,/n",i++,++i,i,i++);
从右往左运算:
i++得到2(i=2,后加1在整条语句执行完才进行)
++i得到3(i=3,先加1,后使用)
i++得到3(i=3,后加1在整条语句执行完才进行)
所以输出结果为:3,3,2,2
然后计算刚才的两次后自增运算后,i=5
printf("%d/n",i);
所以,结果是5
在VS2008中的规则我不太清楚,我的猜测是这样的:
1.++i只执行加法但不显示,等到所有的都计算完了再使用
例:printf("%d,%d,%d,%d,/n",i++,++i+1,i,i++);
结果为:4,6,5,2(显然++i+1里的i是最后用的)
2.i等所有的计算完成了,再使用
例:printf("%d,%d,%d,%d,/n",i++,++i,i+1,i++);
结果是:4,5,6,2(i+1的结果为6,也验证了i是等所有自加运算结束以后才使用的。)
3.i++先使用,紧接着再执行加法,不必等到整条语句都执行完了
例如:对于printf("%d,%d,%d,%d,/n",i++,++i,i,i++);
结果是:4,5,5,2
其他:
对于本程序,VS2008里的第二个printf语句就显得多余了,因为第一句就已经体现了i最终的值,而在VC6.0里第二个printf语句则是十分必要的。