以下是我的代码。
public class ShortCkt {
public static void main(String[] args) {
int i = 0;
boolean t = true;
boolean f = false, b;
b = (t || ((i++) == 0));// why the value of i does not gets increased?
b = (f || ((i += 2) > 0));
System.out.println(i);
}
}
输出: 2
为什么输出是2而不是3?
答案 0 :(得分:4)
如果第一个操作数为||
,true
运算符将作为短路运行。
由于第一个操作数是 true
(t == true
),因此不评估第二个条件(增加i
)。
在第二种情况下,第一个操作数f
是false
,因此第二个操作数被评估,i
增加2
,以值{{1}结束}}。
这与0 + 2 == 2
运算符不同,后者需要对两个操作数进行求值。
在布尔条件中使用时,按位运算符&&
和&
也会计算两个操作数。
<强>摘要强>
|
b = (t || ((i++) == 0)); // b = true OR... whatever, just true
b = (t | ((i++) == 0)); // b = true bitwise or 0 == 0 == true (postfix increment, so i gets incremented after evaluation --> true
b = (t | ((++i) == 0)); // b = true bitwise or 0 == 0 == true (prefix increment, so i gets incremented before evaluation --> false
b = (t && ((++i) == 0)); // b = true AND 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false
答案 1 :(得分:3)
((i++) == 0))
永远不会被评估,因为t
是true
而||
是一个短路的OR运算符,所以第二个(右)操作数仅在第一个被评估时被评估(左)操作数是false
。
在(f || ((i += 2) > 0))
中,两个操作数都被评估,因为f
为false。因此i
从0递增到2。