首页 > 解决方案 > Java 运算符 && 与 || 的求值顺序

问题描述

我有这个简单的代码块

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 程序员 I 认证指南中,twist 2.4,一个类似的例子给出了所有逻辑操作数都将被评估的答案。&&首先评估并且||是最后一个。

但是结果给了我一个假设,即优先级仅用于对操作数和运算符进行分组。从 thisa++ == 10 || b++ == 20 && c++ < 30到 this计算表达式时,它被左侧 a++ == 10 || (b++ == 20 && c++ < 30)的值短路。所以右边的表达式(运算符)不会被计算。因为如果先对算子求值,and的值会增加,但不会。true||&&&&bc

我对么?请帮忙。

标签: javalogical-operators

解决方案


没有括号的评估顺序是从左到右。由于第一次评估是正确的并且因为操作符是 || 其余的没有执行。(如果你的第一个结果是假的,然后你有一个 && 操作符,也会发生同样的情况)。

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

好的想法!!!


推荐阅读