|
发表于 2022-5-26 16:25:34
|
显示全部楼层
本帖最后由 jhq999 于 2022-5-26 16:32 编辑
拿这个举例++a||++b&&++c ;
- int main()
- {
- int a=0,b=0,c=0;
- if (++a||++b&&++c )
- {
- }
- printf("%d %d %d",a,b,c);
- return 0;
- }
复制代码
结果
vs2012反汇编
- 102: if (++a||++b&&++c )
- 00DD38C3 8B 45 F8 mov eax,dword ptr [a]
- 00DD38C6 83 C0 01 add eax,1
- 00DD38C9 89 45 F8 mov dword ptr [a],eax
- 00DD38CC 75 14 jne main+52h (0DD38E2h) ;;;;这里只要a为真,直接跳转根本不执行 ++b&&++c,有的编译器就从右到左先c=1然后b=1,b&&c=true,就不执行++a,结果是0 1 1
- 00DD38CE 8B 45 EC mov eax,dword ptr [b]
- 00DD38D1 83 C0 01 add eax,1
- 00DD38D4 89 45 EC mov dword ptr [b],eax
- 00DD38D7 74 09 je main+52h (0DD38E2h)
- 00DD38D9 8B 45 E0 mov eax,dword ptr [c]
- 00DD38DC 83 C0 01 add eax,1
- 00DD38DF 89 45 E0 mov dword ptr [c],eax
复制代码 |
|