对Java运算符优先级计算结果感到困惑

时间:2018-12-23 20:32:58

标签: java

我有一个表达式,我对结果的计算方式感到困惑

int a = 7;
boolean res = a++ == 7 || a++ == 9;
System.out.println("a = " + a);
System.out.println("res = " + res);

这给了我结果:

a = 8
res = true

我不明白为什么a会得到我期望a = 9的值8,因此有人可以向我解释它的计算方式吗?

4 个答案:

答案 0 :(得分:3)

此处使用惰性评估。在替代方案中,只有一个操作数(参数)需要为真才能使替代结果为真。在这种情况下,left参数是正确的(因为使用postincrementation,a将在检查后增加),因此无需检查替代项的左侧。

这意味着不会执行第二次递增。

答案 1 :(得分:3)

有趣的部分是这样:

boolean res = a++ == 7 || a++ == 9;

评估从这里开始:

a++ == 7

,它实际上被翻译为: a == 7,然后a = a + 1
因此a == 7的值为true,然后a等于8
由于布尔表达式的第一部分是true,所以
由于||OR逻辑运算符)的短路评估,
第二部分a++ == 9未评估/执行。
这意味着a不会再次增加。
如果您想测试对这一概念的理解,请进行以下更改:

boolean res = ++a == 7 || a++ == 9;

并在运行代码之前预测结果。

答案 2 :(得分:1)

++运算符实际上是在语句执行后更改变量值的,即在变量之后写入(a ++代替++ a)。因为a == 7,所以res变为true,然后a的值更改为8

答案 3 :(得分:1)

让我们逐步分析发生的情况:

int a = 7;
boolean res = 
               a++ == 7               // a in this step is equal to 7 not 8
                         || a++ == 9; // even in this step, when the statement is end
                                      // a it will incremented to 8

第一个语句a++ == 7是正确的,因为您得到res => truea => 8

有关更多详细信息,请阅读此Difference between i++ and ++i in a loop?