提起i++(i--)和++i(--i),相信大家非常熟悉。两者的区别是:前者是先赋值,然后再自增或自减;后者是先自增或自减,后赋值。但是当printf函数与多个自增自减表达式结合起来,编译器实现i++(i--)和++i(--i)的原理你真的了解吗?今天,我们从一道有意思的题目揭开printf多个自增自减表达式底层实现的面纱......
源程序
int main()
{
int i = 0;
printf("%d,%d,%d\n",i++,--i,i++);
return 0;
}
按照我们平时对自增自减运算符表达式的理解,我们预期的结果应该是:0,0,0
具体的理解过程是:函数参数的压栈是从右向左压的,所以先把i++产生的临时量0先压入栈,i的值变成1,再经过–i使i变成0,然后将0再压入栈,最后又将i++的临时量i=0压入栈,最后i的值是1,这样压入的结果就是0,0,0了。这种压栈过程其实是每计算出一个参数的值就压入栈。
但是实际结果却是:0,1,0
这是为什么呢?
原因是我们在调用标准库函数printf之前,对所传入的参数进行了遍历,将计算之后的结果保存在寄存器中,并当做实参压入栈中,由于CPU中寄存器的数量是有限的,所以在运算过程中使用了临时量,暂时保留变量的值。其运算的过程可以通过汇编指令来分析。
汇编指令
in