C语言中自增运算符的解析

关于C语言中a++, ++a这种自增运算的讨论其实很无聊,但是有时候为了应付面试,还不得不细细探讨一下。

环境:Win7,VS2010


例题:

写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)

int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

问:a = ?


答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;

改后答案依次为9,10,10,11


分析:

A选项 a += (a++);

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
00F7136E  mov   dword ptr [a],4  
          a += (a++);
00F71375  mov   eax,dword ptr [a]  //把a的值存到eax,此时eax=4
00F71378  add   eax,dword ptr [a]  //eax的值加a,此时eax=8
00F7137B  mov   dword ptr [a],eax  //把eax存到a中,即a=8,由此可以看出,a+=(a++)首先执行的是a = a+a;
00F7137E  mov   ecx,dword ptr [a]  //把a存到ecx
00F71381  add   ecx,1  //ecx+1,此时ecx=9;
00F71384  mov   dword ptr [a],ecx  //ecx存回a,即a=9
return 0;
00F71387  xor   eax,eax  
}


B选项 a += (++a) ;

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
0129136E  mov  dword ptr [a],4  
          a += (++a);
01291375  mov  eax,dword ptr [a]  
01291378  add  eax,1  //先加1,此时eax=5
0129137B  mov  dword ptr [a],eax   //eax存回a,此时a=5
0129137E  mov  ecx,dword ptr [a]  
01291381  add  ecx,dword ptr [a]  //ecx=ecx+ecx,此时ecx=10
01291384  mov  dword ptr [a],ecx //此时a=10
          return 0;
01291387  xor  eax,eax  
}


C选项:(a++) += a;

编译出错:error C2106: '+=' : left operand must be l-value。(a++)是一个表达式,不能赋值。


D选项: (++a) += (a++);

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
0129136E  mov  dword ptr [a],4  
          (++a) += (a++);
00D81375  mov  eax,dword ptr [a]  
00D81378  add  eax,1  
00D8137B  mov  dword ptr [a],eax  //完成++a,此时a=5;
00D8137E  mov  ecx,dword ptr [a]  
00D81381  add  ecx,dword ptr [a]  //完成a=a+a;此时a=10;
00D81384  mov  dword ptr [a],ecx  
00D81387  mov  edx,dword ptr [a]  
00D8138A  add  edx,1  
00D8138D  mov  dword ptr [a],edx  //完成a++;此时a=11
return 0;
01291387  xor  eax,eax  
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值