Java 运算符 && 与 || 的评估顺序

Evaluation order of Java operators && vs ||

我有这个简单的代码块

int a = 10;
int b = 20;
int c = 30;
boolean result = a++ == 10 || b++ == 20 && c++ < 30;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(result);

当我运行这个时候,控制台是

11
20
30
true

这个结果告诉我只有 a++ == 10 被评估了。

正如我读到的https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html, 运算符 &&|| 具有更高的优先级,应首先评估。在这本书 OCA Java SE 8 Programmer I Certification Guide 中,在 twist 2.4 中,一个类似的例子给出了将评估所有逻辑操作数的答案。 && 首先计算,|| 最后计算。

但结果让我假设优先级只是用来对操作数和运算符进行分组。 从这个a++ == 10 || b++ == 20 && c++ < 30到这个 a++ == 10 || (b++ == 20 && c++ < 30) expression 求值时,被||左边的值true短路。所以右边的表达式(&& 运算符)不会被计算。 因为如果运算符 && 先求值,bc 的值会增加,但不会增加。

我说的对吗?请帮忙。

This result tell me that only a++ == 10 is evaluated.

这是语言定义规定的结果。

But the result give me an assumption that the priority is just used to group operands and operators.

你是对的。

不带括号的求值顺序是从左到右。 由于第一个评估是真实的并且因为操作是 ||其余的不执行。 (如果您的第一个结果为假,然后您有一个 && 运算符,也会发生同样的情况)。

++运算符总是在比较执行之后执行。 (在C++中有两种不同的运算符++c和c++然后你可以选择何时进行加法)

好主意!!!

tutorial page on operators 仅在执行 java 代码时为您提供运算符优先级的非正式描述。页面上显示的 table 在 JLS 中并不存在。 execution/evaluation顺序取决于源代码的解析方式和解析树的生成方式。

代码片段 a || b && c(在此示例代码中)将被解析为 Expression:

Expression:
  LambdaExpression
  AssignmentExpression

在这种情况下,它是一个 AssignmentExpression:

AssignmentExpression:
  ConditionalExpression
  Assignment

在这种情况下,它是 ConditionalExpression:

ConditionalExpression:
  ConditionalOrExpression
  ConditionalOrExpression ? Expression : ConditionalExpression
  ConditionalOrExpression ? Expression : LambdaExpression

在这种情况下,它是 ConditionalOrExpression(第一行,不是带有三元运算符的行):

ConditionalOrExpression:
  ConditionalAndExpression
  ConditionalOrExpression || ConditionalAndExpression

这里我们将把它翻译成第二行 (ConditionalOrExpression || ConditionalAndExpression),因为这里有 "||" 个字符(实际的 || operator)。

JLS指定||运算符的左操作数首先由15.7.1. Evaluate Left-Hand Operand First计算:

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.

它还指定 || 运算符是“短路的”,如 15.24. Conditional-Or Operator ||:

中所定义

The conditional-or operator || operator is like | (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is false.

总的来说,这意味着左边的操作数被评估(a++ == 10,这将增加变量 a)并且因为这个比较结果是 true,右边的操作数不会进行评估。因此 b++c++ 都不会以任何方式进行评估。