通过汇编代码深入理解运算符优先级
环境为 visual studio 2019 community
#include <iostream>
using namespace std;
int main()
{
int a = 2, b = 0;
if (a || b++)
{
cout << b;
}
}
这是一个很常见的判断语句,其中判断条件 a||b++ 等价于 a!=0 || b++!=0 ,两种写法汇编代码完全相同
002E1D26 83 7D F8 00 cmp dword ptr [a],0
002E1D2A 75 3A jne main+76h (02E1D66h)
002E1D2C 8B 45 EC mov eax,dword ptr [b]
002E1D2F 89 85 28 FF FF FF mov dword ptr [ebp-0D8h],eax
002E1D35 8B 4D EC mov ecx,dword ptr [b]
002E1D38 83 C1 01 add ecx,1
002E1D3B 89 4D EC mov dword ptr [b],ecx
002E1D3E 83 BD 28 FF FF FF 00 cmp dword ptr [ebp-0D8h],0
002E1D45 74 0C je main+63h (02E1D53h)
002E1D47 C7 85 24 FF FF FF 01 00 00 00 mov dword ptr [ebp-0DCh],1
002E1D51 EB 0A jmp main+6Dh (02E1D5Dh)
002E1D53 C7 85 24 FF FF FF 00 00 00 00 mov dword ptr [ebp-0DCh],0
002E1D5D 83 BD 24 FF FF FF 00 cmp dword ptr [ebp-0DCh],0
002E1D64 74 19 je main+8Fh (02E1D7Fh)
!=和||的优先级比较容易理解,++和!=可以看到具体的运算过程是:先将b中的值存放到eax中,再将eax中的值存放到ebp-0D8h中,再将b 的值存放到ecx中,将ecx增1,再将ecx存放到b中,完成b++,之后用前面保存到ebp-0D8h中的b的初始值进行比较并跳。