这是代码段
你能解释一下输出变化的原因吗?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况下的输出为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);
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况下的输出是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);
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况下的输出是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);
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况下的输出是3
aio*_*obe 12
为什么在&&,&,||的情况下输出不同 ?
就像在C/C++ &&中一样,"lazily"被评估,而&不是.
如果a为false则a && b返回false而不进行评估b.
同样a || b如下:如果第一个操作数a为true,则整个表达式为true,b并且永远不会计算第二个操作数.对于a | b然而,无论是a和b进行评估.
如果使用&&(或||)时未评估的操作数具有副作用,则会产生这种后果,如示例中所示.
旁注:很少有java程序员知道^(xor)也适用于布尔值.(一个^^版本不存在仅仅因为它是多余的.)
boolean我们关注的是4个二元运算符:
&& 是条件和运算符
& 是逻辑和运营商|| 是条件或运算符
| 是逻辑或运营商这是关键点:
true仅在两个操作数均为时true
false,则结果false与右操作数无关true仅在至少有一个操作数的情况下true
true,则结果true与右操作数无关换句话说,假设没有异常等:
&并| 始终评估两个操作数&&并有条件地||评估正确的操作数; 只有当其值可能影响二进制操作的结果时,才会评估右操作数.这意味着在以下情况下不评估右操作数:
&&计算结果为false
false)||计算结果为true
true)&,^和|
&,结果值是true两个操作数值是否为true; 否则,结果是false.|,结果值是false两个操作数值是否为false; 否则,结果是true.&&
&&操作是一样&的,但评估其右边的操作数只有在其左侧操作数的值true.||
||操作是一样|的,但评估其右边的操作数只有在其左侧操作数的值false.| 归档时间: |
|
| 查看次数: |
1406 次 |
| 最近记录: |