网上、书上都说,是&&运算符优先级大于||。
可是下面代码:
#include
int main()
{
int a = 1;
int b = 1;
int c = 1;
++a || ++b && ++c;
printf("a = %d , b = %d, c = %d\n", a, b, c);
return 0;
}
咋分别是2、1、1。不应该是先加b和c么?
反汇编:
10: ++a || ++b && ++c;
0040103D mov eax,dword ptr [ebp-4] ; &a = [ebp - 4]
00401040 add eax,1 ; ++a
00401043 mov dword ptr [ebp-4],eax ; 把计算结果保存到a的地址
00401046 cmp dword ptr [ebp-4],0 ; 判断是否为0
0040104A jne main+54h (00401064) ; 不为0跳到printf结束
0040104C mov ecx,dword ptr [ebp-8] ; &b = [ebp - 8]
0040104F add ecx,1 ; ++b
00401052 mov dword ptr [ebp-8],ecx ; 保存结果
00401055 cmp dword ptr [ebp-8],0 ; 比较是否为0
00401059 je main+54h (00401064) ; 为0,则&&不成立,跳走
0040105B mov edx,dword ptr [ebp-0Ch] ; c,以此类推
0040105E add edx,1 ; ++c
00401061 mov dword ptr [ebp-0Ch],edx ; 保存结果
和++a || (++b && ++c)反汇编一样,实际都先算++a了。
是编译器优化的结果?