下面是我的代码。
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?
因为如果第一个操作数是true
,则||
运算符将作为短路操作。
由于第一个操作数是true
(t == true
(,因此不计算第二个条件(递增i
(。
在第二种情况下,第一个操作数f
是false
,因此计算第二个操作数,并且i
递增2
,以值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
b = (t & ((++i) == 0)); // b = true bitwise and 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false
((i++) == 0))
从不求值,因为t
是true
,而||
是短路OR运算符,所以只有当第一个(左(操作数是false
时,才会求值第二个(右(操作数。
在(f || ((i += 2) > 0))
中,由于f
为false,因此对两个操作数进行求值。因此CCD_ 26从0递增到2。