2、在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。
在计算时,遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候则不会将此时的计算结果作为最终的输出,只会修改x的值,在最终输出的时候都输出x的值(所以++x和x的结果总是一样的)。
为什么会是这个样子呢?参见某高手解释吧:对于a++的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作。 (来源:http://www.zzzj.com/html/20090609/71613.html)
每次只需要计算最后的a值,a++是直接压栈作为输出的,其余 a、++a 是最后计算的结果,a和++a的输出值是一样的。
先看一段代码,猜猜会是什么输出:
- x=1; printf("%d %d\n",x,x++);
- x=1; printf("%d %d\n",x++,x);
- x=1; printf("%d %d %d\n",x,x++,x);
- x=1; printf("%d %d %d %d\n",x,++x,x++,x);
- 2 1
- 1 2
- 2 1 2
- 3 3 1 3
函数参数的计算顺序也是从右至左:
#include "stdio.h"
void fn(int a,int b,int c)
{
printf("%d,%d,%d", a, b, c);
}
void main()
{
int a = 3;
fn(a++, a++, a++);
}
输出结果:
5,4,3
原因分析:
C函数参数作为一个整体执行的顺序是从右向左,所以会先处理最右端的参数,然后依次向左处理。所以结果为最右端的a++先被处理结果为3,然后++,接着4和5,这样就有了上面的结果。