如果他们确实位于不同的行,那么不应该Exp1 || Exp2 && Exp3
,(Exp2 && Exp3)
首先评估,因为&&
的优先级高于||
?
并且,如果他们确实位于同一行,那么执行顺序应该是首先(Exp1 || Exp2)
然后是&& Exp3
,因为两者都是关联的?
答案 0 :(得分:4)
Exp1 || Exp2 && Exp3
分组为Exp1 || (Exp2 && Exp3)
。
请注意,如果(Exp2 && Exp3)
评估为0,则Exp1
实际上仅评估,然后Expr3
仅评估 { {1}}评估为1.这称为短路。
他们处于不同的“行”并不相关。
答案 1 :(得分:2)
C中的运算符优先级为"如语法"所示,用简单的英语表示标准章节6.5的每个子章节都是一个运算符组。优先级是:第一组,最高优先级:
6.5表达式
6.5.1主要表达方式
6.5.2后缀运算符
6.5.3一元运算符
6.5.4铸造操作员
6.5.5乘法运算符
6.5.6添加剂操作员
6.5.7按位移位运算符
6.5.8关系运营商
6.5.9平等运营商
6.5.10按位AND运算符
6.5.11按位异或运算符
6.5.12按位包含OR运算符
6.5.13逻辑AND运算符
6.5.14逻辑OR运算符
6.5.15有条件的操作员
6.5.16指配操作员
6.5.17逗号运算符
如您所见,Logical AND是一个与Logical OR分开的组。它出现在标准的前面,因此具有更高的优先级。
如果它们已经在同一行"中,即如果它们具有相同的优先级,那么运算符关联性将决定如何解析表达式。 a || b || c
必须解析为(a || b) || c
,因为此运算符组的关联性是从左到右。
请注意,运算符优先级仅指定属于哪些运算符的操作数。它没有指定评估(执行)的顺序,这是一个不同但相关的术语。
在您的情况下,运算符优先级指定Exp1 || Exp2 && Exp3
等效于
Exp1 || (Exp2 && Exp3)
||
运算符的评估顺序具体是一种特殊情况,它必须首先完全评估Exp1
,如果它是假的,那么,只评估右手运算符。 / p>
通常在C中,未指定操作数的评估顺序。例如Exp1 | Exp2
,其中不存在特殊的评估顺序规则。然后,可以先评估Exp1
或Exp2
。