对于输出过程常常出现以下的问题:
对于输出的顺序往往不明所以,经过调试可以逐步分析:
1.改变第一个a- -:
2.改变++a:
3:
4:
通过上述几个例子进行一点总结:
首先需要明确的一点是,函数括号内的运行顺序是从右向左的,对于上述前三个例子中的第二个printf,即便是从右向左运行,但运行结果不改变a本身的值,因此无论从什么方向看其实都是a本身的加减得到值进行输出的。
从第四个例子看,当将a++,或++a放在最左边的时候是不影响后面a+4的运算的,但放在右边则显然a本身的值改变,增加了一,影响了前面的运算,由此也可证明了括号内的运算是从右向左的;
那么再看前三个例子中第一个printf,首先从右向左进行运算++a同样是对a做加一运算,但是很明显,a并未如同a++一样发生改变,换一种理解方式似乎对于三种情况就能解释的通:对于++a,–a只进行运算,等所有运算结束后在从左向右将得到的结果赋给a;而对于a++,a–则是由于方向原因,从右向左运算后立即对其赋值。这样对第一个例子做出解释:
- 右边三个++a先进行运算,得到a=6,于是a++中的a为6同时输出后加一为7;
- a–中输出7,同时进行a减一操作,此时a=6;
- 由于–a与++a类似只运算不进行赋值,那么a=5;
- 于是乎第一个a输出5同时做减一操作,此时a=4;
- 这样对于–a,++a未进行输出的项就将最终结果输出,得到如上的4。
其余两个用这样的理解方式也可解释的通,这样就可以解释所有上述输出结果。
(纯属个人理解观点,如果有误希望大家纠正!)