1.i++与++i的汇编角度分析
在汇编语言中,
i++的操作顺序如下:
1.先把i的值存储在[EBP-&]的一个缓存单元中
2.把i的值自增加1
3.将[EBP-&]作为i++返回值
++i的操作顺序如下:
1.把i的值加自增加1
2.将i作为++i返回值
2. 函数printf()中,"表达式参数"的计算顺序、返回值入栈顺序、输出顺序
【计算顺序】
从右往左依次计算每个表达式的返回值
【返回值入栈顺序】
从右往左依次把表达式的返回值入栈
【输出顺序】
把栈中的值全部输出
【举例】
【题1】
#include<stdio.h>
int main(){
int i=1;
printf("%d,%d",++i,i++);
}
【计算分析】
因为printf()函数对表达式的计算顺序是从右往左,故
首先注意到i++
1.先把i的值存储在[EBP-01]的一个缓存单元中,此时[EBP-01]=1
2.把i的值自增加1,有i=i+1;此时有i=2
(故,i++的返回值是[EBP-01])
再注意到++i
3.把i的值自增加1,有i=i+1,此时i=3
(故,++i的返回值是i)
【表达式返回值入栈分析】
因为printf()是从右往左依次把表达式的返回值入栈,故
1.先把i++的返回值入栈(即 取出[EBP-01]里的值:1 让这个值入栈)
2.再把++i的返回值入栈(即 取出i的值:3 让这个值入栈)
【输出分析】
因为输出的规则是把栈中的值全部输出,故
1.先输出3
2.再输出1
故结果为
3,1
【结果验证】
【题2】
#include<stdio.h>
int main(){
int i=1;
printf("%d,%d,%d",i++,++i,++i);
}
【计算分析】
首先注意到++i
1.把i的值自增加1,有i=i+1,此时i=2
(故,++i的返回值是i)
再注意到++i
3.把i的值自增加1,有i=i+1,此时i=3
(故,++i的返回值是i)
再注意到i++
4.把i的值存储在[EBP-01]的一个缓存单元中,此时[EBP-01]=3
5.把i的值自增加1,有i=i+1;此时有i=4
(故,i++的返回值是[EBP-01])
【表达式返回值入栈分析】
1.先把i++的返回值入栈(即 取出i的值:4 让这个值入栈)
2.再把++i的返回值入栈(即 取出i的值:4 让这个值入栈)
3.再把i++的返回值入栈(即 取出[EBP-01]里的值:3 让这个值入栈)
【输出分析】
因为输出的规则是把栈中的值全部输出,故
1.先输出3
2.再输出4
3.再输出4
故结果为
3,4,4
【结果验证】