关于&&和||运算符优先级的问题

C语言 码拜 10年前 (2015-07-01) 1209次浏览 0个评论

网上、书上都说,是&&运算符优先级大于||。
可是下面代码:

#include <stdio.h>

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了。
是编译器优化的结果?

VC6 、win2003
15分
对啊,|| 符号不是先执行左边  成功了 就不看右边么?
引用 2 楼 king191923157 的回复:

对啊,|| 符号不是先执行左边  成功了 就不看右边么?

可是优先级高的不先算吗?

25分
优先级高表示
++a || ++b && ++c

++a || (++b && ++c)
而不是
(++a || ++b) && ++c

其次这些运算都是从左向右演算的。

举四则运算的例子:
1 + 2 * 3
*比+优先级高,表示上式为
1 + (2 * 3)
而不是
(1 + 2) * 3
但是它们都是从左向右演算的,即就+而言
它先演算1

就原问题而言,就||而言
先演算++a

其次就是||是短路的

Short-circuit evaluation

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于&&和||运算符优先级的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!