a++,++a——关于C优先级

来源:互联网 发布:淘宝店招代理 编辑:程序博客网 时间:2024/06/08 13:33
某笔试题:int  a = 4; 
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); 

判断上述表达式是否正确,若正确则a = ?

——————————————————————————

解析:事实说明一切,查汇编代码!

选项A、B的测试代码(VC++):

int main() { int a = 4;int b = 4;a+=(a++);b+=(++b);printf("a=%d,b=%d",a,b);return 0;}

汇编片段:

int a = 4;0041140E  mov         dword ptr [a],4  int b = 4;00411415  mov         dword ptr [b],4  int c,d;a+=(a++);0041141C  mov         eax,dword ptr [a]  0041141F  add         eax,dword ptr [a]  00411422  mov         dword ptr [a],eax  00411425  mov         ecx,dword ptr [a]  00411428  add         ecx,1  0041142B  mov         dword ptr [a],ecx  b+=(++b);0041142E  mov         eax,dword ptr [b]  00411431  add         eax,1  00411434  mov         dword ptr [b],eax  00411437  mov         ecx,dword ptr [b]  0041143A  add         ecx,dword ptr [b]  0041143D  mov         dword ptr [b],ecx  

1. 对于a+=(a++),实际机器是这样执行的:

第一步,算a+a(结果为8);第二步,把a+a赋值给a(此时a=8);第三步,算a++(结果为9);第四步,把“a++”赋给a(a=9)。

2. 对于b+=(++b),实际机器是这样执行的:

第一步,算++b(结果为5);第二步,把++b赋值给b(此时b=5);第三步,算b+b(结果为10);第四步,把“b+b”赋给b(b=10)。

——————————————————————————

为什么是这样?

答:编译器和机器是这么干的。

这种代码的意义?

答:除了让代码难以理解,似乎达到了“简洁就是美”。对于这种表达式的意义,机器是确定的,但人是不确定的。所以没必要去纠结人不能确定的代码!

——————————————————————————

PS:可参考文章i++ : 顺序点(sequence point) 与 副作用 (side effect)

0 0
原创粉丝点击