做'&&'和' ||'在运算符优先级或不同的行中位于同一行?

时间:2018-06-05 08:28:33

标签: c operators logical-operators operator-precedence

如果他们确实位于不同的行,那么不应该Exp1 || Exp2 && Exp3(Exp2 && Exp3)首先评估,因为&&的优先级高于||

并且,如果他们确实位于同一行,那么执行顺序应该是首先(Exp1 || Exp2)然后是&& Exp3,因为两者都是关联的?

2 个答案:

答案 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,其中不存在特殊的评估顺序规则。然后,可以先评估Exp1Exp2