#include<stdio.h>
int main(int arc,char *argv[])
{
int i=10;
printf("%d %d %d %d \n",i++,++i,++i,i++);
return 0;
}
眼看的错误结果:13 13 12 10
实际运行结果:13 14 14 10
前置知识:
1.i++与++i的汇编角度分析
在汇编语言中,
i++的操作顺序如下:
1.先把i的值存储在[EBP-&]的一个缓存单元中
2.把i的值自增加1
3.将[EBP-&]作为i++返回值
++i的操作顺序如下:
1.把i的值加自增加1
2.将i作为++i返回值
2. 函数printf()中,"表达式参数"的计算顺序、返回值入栈顺序、输出顺序
【计算顺序】
从右往左依次计算每个表达式的返回值
【返回值入栈顺序】
从右往左依次把表达式的返回值入栈
【输出顺序】
把栈中的值全部输出
以上例子分析 :
第一个操作:
i++:1.先把i的值存储在[EBP-&]的一个缓存单元中 [EBP-01]放入(10)
2.把i的值自增加1 (11)
3.将[EBP-&]作为i++返回值 (10)
第二个操作:
++i: 1.把i的值加自增加1 (12)
2.将i作为++i返回值 (12)
第三个操作:
++i: 1.把i的值加自增加1 (13)
2.将i作为++i返回值 (13)
第四个操作:
i++: 1.先把i的值存储在[EBP-&]的一个缓存单元中 [EBP-01]放入(13)
2.把i的值自增加1 (14)
3.将[EBP-&]作为i++返回值 (13)
第五个操作:
printf
【返回值入栈顺序】
从右往左依次把表达式的返回值入栈
i++: 返回值 [EBP-01](10)入栈
++i:返回值 i(14) 入栈
++i:返回值 i(14) 入栈
i++:返回值 [EBP-01](13)入栈
【输出顺序】
把栈中的值全部输出
13 14 14 10