#include<stdio.h>int main(int arc,char *argv[]){ int i=10; printf(“%d %d %d %d \n“,i++,++i,

#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

                        

                        
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值