我有一个表达式,我对结果的计算方式感到困惑
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,因此有人可以向我解释它的计算方式吗?
答案 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 => true
和a => 8
有关更多详细信息,请阅读此Difference between i++ and ++i in a loop?