自增自减运算符

【转】

#include <stdio.h>
int main()
{
int a , b;
a = 3;
b = (a++)+(a++)+(a++);
printf("a=%d b=%d/n", a ,b );

a = 3;
b = (++a)+(++a)+(++a);
printf("a=%d b=%d/n", a ,b );

 

return 0;
}

VC反汇编代码:
#include <stdio.h>
2:    int main()
3:    {
0040D730 55                   push        ebp
0040D731 8B EC                mov         ebp,esp
0040D733 83 EC 48             sub         esp,48h
0040D736 53                   push        ebx
0040D737 56                   push        esi
0040D738 57                   push        edi
0040D739 8D 7D B8             lea         edi,[ebp-48h]
0040D73C B9 12 00 00 00       mov         ecx,12h
0040D741 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
0040D746 F3 AB                rep stos    dword ptr [edi]
4:        int a , b;
5:        a = 3;
0040D748 C7 45 FC 03 00 00 00 mov         dword ptr [ebp-4],3
6:        b = (a++)+(a++)+(a++);
0040D74F 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040D752 03 45 FC             add         eax,dword ptr [ebp-4]
0040D755 03 45 FC             add         eax,dword ptr [ebp-4];这里先进行括号外的加运算
0040D758 89 45 F8             mov         dword ptr [ebp-8],eax
0040D75B 8B 4D FC             mov         ecx,dword ptr [ebp-4];然后执行括号内的运算
0040D75E 83 C1 01             add         ecx,1
0040D761 89 4D FC             mov         dword ptr [ebp-4],ecx
0040D764 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040D767 83 C2 01             add         edx,1
0040D76A 89 55 FC             mov         dword ptr [ebp-4],edx
0040D76D 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040D770 83 C0 01             add         eax,1
0040D773 89 45 FC             mov         dword ptr [ebp-4],eax
7:        printf("a=%d    b=%d/n", a ,b );
0040D776 8B 4D F8             mov         ecx,dword ptr [ebp-8]
0040D779 51                   push        ecx
0040D77A 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040D77D 52                   push        edx
0040D77E 68 1C 20 42 00       push        offset string "a=%d/nb=%d/n" (0042201c)
0040D783 E8 18 39 FF FF       call        printf (004010a0)
0040D788 83 C4 0C             add         esp,0Ch
8:
9:        a = 3;
0040D78B C7 45 FC 03 00 00 00 mov         dword ptr [ebp-4],3
10:       b = (++a)+(++a)+(++a);
0040D792 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040D795 83 C0 01             add         eax,1
0040D798 89 45 FC             mov         dword ptr [ebp-4],eax;执行第一个括号内的加运算
0040D79B 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040D79E 83 C1 01             add         ecx,1
0040D7A1 89 4D FC             mov         dword ptr [ebp-4],ecx;执行第二个括号内的加运算
0040D7A4 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040D7A7 03 55 FC             add         edx,dword ptr [ebp-4];将前两个括号内的值相加
0040D7AA 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040D7AD 83 C0 01             add         eax,1
0040D7B0 89 45 FC             mov         dword ptr [ebp-4],eax;执行第三个括号的加运算
0040D7B3 03 55 FC             add         edx,dword ptr [ebp-4];将三个括号内的值相加
0040D7B6 89 55 F8             mov         dword ptr [ebp-8],edx;保存结果
11:       printf("a=%d    b=%d/n", a ,b );
0040D7B9 8B 4D F8             mov         ecx,dword ptr [ebp-8]
0040D7BC 51                   push        ecx
0040D7BD 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040D7C0 52                   push        edx
0040D7C1 68 1C 20 42 00       push        offset string "a=%d/nb=%d/n" (0042201c)
0040D7C6 E8 D5 38 FF FF       call        printf (004010a0)
0040D7CB 83 C4 0C             add         esp,0Ch
12:
13:
14:
15:       return 0;
0040D7CE 33 C0                xor         eax,eax
16:   }
0040D7D0 5F                   pop         edi
0040D7D1 5E                   pop         esi
0040D7D2 5B                   pop         ebx
0040D7D3 83 C4 48             add         esp,48h
0040D7D6 3B EC                cmp         ebp,esp
0040D7D8 E8 43 39 FF FF       call        __chkesp (00401120)
0040D7DD 8B E5                mov         esp,ebp
0040D7DF 5D                   pop         ebp
0040D7E0 C3                   ret

 

总结:

对于b = (a++)+(a++)+(a++);
在遇到分号之前是不执行加一操作的,而只是简单的把三个括号的值相加,这样b=3+3+3=9;当遇到分号的时候,就要进行后自增运算了,这时会进行3次自增运算,最后a=6。

 

对于b = (++a)+(++a)+(++a);

每次遇到一个前自增运算符,都要进行加一操作,首先是第一个括号内进行加一操作得到a=4,然后第二个括号内进行加一操作得到a=5,这样子前面两个括号的值为10=5+5;然后计算第三个括号的值使得a=6,然后加上前面得到的16,最后得到b=16。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值