这是代码段
你能解释一下输出变化的原因吗?
1)
public static ShortCkt { public static void main(String args[]) { int i = 0; boolean t = true; boolean f = false,b; b = (t && ((i++) == 0)); b = (f && ((i+=2) > 0)); System.out.println(i); } }
这种情况下的输出为1
2)
public static ShortCkt { public static void main(String args[]) { int i = 0; boolean t = true; boolean f = false,b; b = (t & ((i++) == 0)); b = (f & ((i+=2) > 0)); System.out.println(i); } }
这种情况下的输出是3
3)
public static ShortCkt { public static void main(String args[]) { int i = 0; boolean t = true; boolean f = false,b; b = (t || ((i++) == 0)); b = (f || ((i+=2) > 0)); System.out.println(i); } }
这种情况下的输出是2
4)
public static ShortCkt { public static void main(String args[]) { int i = 0; boolean t = true; boolean f = false,b; b = (t | ((i++) == 0)); b = (f | ((i+=2) > 0)); System.out.println(i); } }
这种情况下的输出是3
解决方法
Why is the output different in case of &&,&,|| ?
就像在C/C++&&被评估为“懒惰”而&不是.
如果a是假的那么&& b甚至不评估b就会返回false.
同样适用于|| b:如果第一个操作数a为真,则整个表达式为真,第二个操作数b从不进行求值.对于|但是,a和b都将被评估.
如果在使用&&和/或(或||)有副作用,如您的示例中所示.
旁注:很少有java程序员知道^(xor)也适用于布尔值. (A ^^版本不存在仅仅因为它是多余的.)