a++,++a——关于C优先级
来源:互联网 发布:淘宝店招代理 编辑:程序博客网 时间:2024/06/08 13:33
某笔试题:int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
汇编片段:
1. 对于a+=(a++),实际机器是这样执行的:
(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
- a++,++a——关于C优先级
- 关于C语言中的a++,++a,a--,--a;
- C++:关于int *a; int &a; int & *a; int * &a
- [C/C++]数组与指针——a,a[0],&a,&a[0]区别小结
- 关于指针* —— int a; int* a; int** a; int (*a)[10]; int (*a)(int)区别
- C语言++a与a++的实现机制与操作符结合优先级
- [c/c++]A a();与A a;
- [C++]:A*——A Star算法简介
- [C++]:A*——A Star算法简介
- 关于C语言中a=a++与a=++a的研究
- 关于C语言的printf("%d,%d,%d,%d\n",a,++a,a--,a--);
- 关于a++和++a
- 关于数组&a a
- 关于 ( ++a )和( a++ )
- 关于 a-- 和 --a
- 关于a++和++a
- 关于(++a)+(++a)
- 关于a++和++a
- ubuntu ch341 usb-serial adaptor
- 通过属性文件来得到数据库的链接
- Android Bundle类
- 第八周项目2-Time类的运算符重载
- android中Parcelable接口的使用
- a++,++a——关于C优先级
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- QTP waitPageLoading
- php基础面试题
- 在Manifest文件中设置全屏相关属性
- aapt常用命令
- SSL/TLS 协议详解
- web app开发技巧总结
- c#如何跨越线程调用窗体上的控件 GOOD