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
短路。所以右边的表达式(&&
运算符)不会被计算。
因为如果运算符 &&
先求值,b
和 c
的值会增加,但不会增加。
我说的对吗?请帮忙。
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++
都不会以任何方式进行评估。
我有这个简单的代码块
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
短路。所以右边的表达式(&&
运算符)不会被计算。
因为如果运算符 &&
先求值,b
和 c
的值会增加,但不会增加。
我说的对吗?请帮忙。
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 isfalse
.
总的来说,这意味着左边的操作数被评估(a++ == 10
,这将增加变量 a
)并且因为这个比较结果是 true
,右边的操作数不会进行评估。因此 b++
和 c++
都不会以任何方式进行评估。