以下是代码段
你能解释为什么输出变化
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
答案 0 :(得分:12)
为什么在&&,&,||的情况下输出会有所不同?
正如在C / C ++中&&
被评估为“懒惰”,而&
则不是。{/ p>
如果a
为false,则a && b
将返回false,甚至不评估b
。
同样适用于a || b
:如果第一个操作数a
为真,则整个表达式为真,并且永远不会计算第二个操作数b
。但是,对于a | b
,我们将评估a
和b
。
如果在使用&&
(或||
)时未评估的操作数具有副作用,则会产生后果,如示例所示。
旁注:很少有java程序员知道^
(xor)也适用于布尔值。 (^^
版本不存在仅仅因为它是多余的。)
答案 1 :(得分:7)
我们在这里关注了4个boolean
二元运算符:
&&
是条件和运算符
&
是逻辑和运算符||
是条件或运算符
|
是逻辑或运算符这是关键点:
true
时,“和”的结果才为true
false
,则无论右操作数为何,结果为false
true
时,“或”的结果为true
true
,则无论右操作数为何,结果为true
换句话说,假设没有异常等:
&
和|
始终评估两个操作数&&
和||
有条件地评估右操作数 ;只有当其值可能影响二进制操作的结果时,才会评估右操作数。这意味着在以下情况下不评估右操作数:
&&
的左操作数评估为false
false
)||
的左操作数评估为true
true
)&
, ^
, and |
&
,如果两个操作数值均为true
,则结果值为true
;否则,结果为false
。|
,如果两个操作数值均为false
,则结果值为false
;否则,结果为true
。&&
&&
运算符与&
类似,但仅在其左侧操作数的值为true
时才计算其右侧操作数。||
||
运算符与|
类似,但仅在其左侧操作数的值为false
时才计算其右侧操作数。答案 2 :(得分:1)
&&
和||
是逻辑AND和OR运算符,它们始终生成boolean
表达式。 &
和|
是按位AND和OR运算符,它们对每一方进行逐位比较。有关这些运营商的更多信息,请参阅this link
答案 3 :(得分:1)
这是因为&&和||是逻辑运算符,是“短循环机制”。如果你使用||并且第一个表达式的计算结果为true,第二个表达式不会被评估,因此我不会被过时。 &安培;和|是按位运算符,它对输入进行位计算。这些没有短路,因此无论如何都会评估整个表达式。
答案 4 :(得分:1)
&
和|
运算符是按位的,因此必须在运算符可以使用之前对表达式的两边进行求值,因此在情况2和4中,运算符的两边都是总是评估。
情况1和3之间的区别基于短路逻辑。
在案例1中,第二个表达式中的&&
运算符在第一个false
上短路为false
,导致表达式的后半部分不被评估。
在案例3中,第二个表达式的前半部分中的false
导致对表达式后半部分的评估,递增i
。如果false || expr
也为假,则false
只能是expr
。因此必须对其进行评估。