如有错误请指正,谢谢!
将网上提供的代码做了部分修改进行研究验证,代码如下:
#include<stdio.h>
int main()
{
int i;
// EX1
i = 1;
printf("%d %d %d %d %d %d\n",i,i++,i,--i,++i,i);
fflush(stdout);
printf("%d\n",i);
fflush(stdout);
//EX2
i = 1;
printf("%d %d %d %d %d %d %d\n",i,i++,i++,i,--i,++i,i);
fflush(stdout);
printf("%d\n",i);
fflush(stdout);
//EX3
i = 1;
printf("%d %d %d %d %d %d\n",i,i--,i,--i,++i,i);
fflush(stdout);
printf("%d\n",i);
return 0;
}
运行结果如下:
根据CSDN论坛UGG网友对printf函数的部分解释如下:
1,print函数在处理变量参数的时候是按照从右至左的次序;
2,a++,在函数运行中,并不进行运算处理,函数运行完毕方才处理;
3,++a,在函数运行行中处理函数,相当于a+=1
在调用printf()时,i++,i--,++i等为表达式,所以需对其进行计算将表达式结果入栈。入栈的过程也可以理解为参数传递的过程,先将函数参数保存在栈中,等待printf库实现来栈中取数据。先入栈的就先保存,此处保存前还需进行计算,但计算结果会对后入栈的有影响,并且自增自减的计算根据结果来看符合网友UGG的说法。也就是说并非所有的自增自减都是进过计算入栈的,i--、i++入栈的直接是i值,并没有进行计算(EX1和EX3可以看出),而是等待调用结束后在进行自增或者自减运算(EX2可以看出)。另外,忽然想到ARM中的参数传递有另外ATPCS规则,好像函数参数是通过寄存器进行传递,并不是通过栈进行的。