逻辑操作符
逻辑操作符&& 、|| 、! 能根据参数的逻辑关系,生成一个布尔值(true或false)
//:operators/Bool.java
//Relational and logical operators.
import java.util.*;
import static net.mindview.util.Print.*;
public class Bool{
public static void main(String [] args){
Random rand=new Random(47);
int i=rand.nextInt(100);
int j=rand.nextInt(100);
print(“i=”+i);//58
print(“j=”+j);//55
print(“i >j is”+ (i > j));//true
print(“i <j is”+(i<j));//false
print(“i >=j is”+(i >= j));//true
print(“i <=j is”+(i <= j));//false
print(“i ==j is”+(i == j));//false
print(“i !=j is”+(i != j));//true
//Treating an int as a boolean is not legal java:
//! print(“i && j is ” + ( i && j));
//! print(“i || j is ” + ( i || j));
//! print(“ !i is ” + !i );
print(“(i<10) && (j<10) is” + ((i<10) && (j<10)));//false
print(“(i<10)|| (j<10) is” + ((i<10) || (j<10)));//false
}
}
///:~
“与”“或”“非”操作只可应用于布尔值。
与在C及C++中不同的是:不可将一个非布尔值当做布尔值在逻辑表达式中使用。
在前面的代码中用“//!”注释掉的语句,就是错误的用法。这种注释语法使得注释能够被自动移除以方便测试。
后面的两个表达式先使用关系比较运算,生成布尔值,然后再对产生的布尔值进行逻辑运算。
注意,如果在应该使用String值得地方使用了布尔值,布尔值会自动转换成适当的文本形式。
在上述程序中,可将整数类型替换成除布尔型以外的其他任何基本数据类型。
但要注意,对浮点数的比较是比较严格的。
即使一个数仅在小数部分与另一个数存在极微小的差异,仍然认为他们是不相等的。
即使一个数之比零大一点点,它仍然是“非零”值。
短路(Short-circuiting )
当使用逻辑操作符时,我们会遇到一种“短路”现象。
即一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了。
因此,整个逻辑表达式靠后的部分有可能不会被运算。下面是演示短路现象的例子:
//:operators/ShortCircuit.java
//Demonstrates short-circuiting behavior
//with logical operators
import static net.mindview.util.Print.*;
public class ShortCircuit{
static boolean test1(int val){
print(“test1(”+val+”)”);//test1(0)
print(“result:”+(val<1)); result:true
return val<1;
}
static boolean test2(int val){
print(“test2(”+val+”)”);//test2(2)
print(“result:”+(val<2)); //false
return val<1;
}
static boolean test3(int val){
print(“test3(”+val+”)”);
print(“result:”+(val<3));
return val<1;
}
public static void main(String [] args){
boolean b=test1(0) && test2(2) && test3(2);
print(“expression is” +b);//expression is false
}
}
///:~
每个测试都会比较参数,并返回true或false。
它也会打印信息告诉你正在条用测试,这些测试都作用与下面这个表达式:
test1(0) && test2(2) && test3(2)
你会很自然地认为所有这三个测试都会得以执行。
但输出显示并非这样。第一个测试生成true,所以表达式计算会继续下去。
然而,第二个测试产生了一个false结果。
由于这意味着整个表达式肯定为false,所以没必要继续计算剩余的表达式,那样只是浪费
“短路”一词的由来正源于此。
事实上,如果所有的逻辑表达式都有一部分不必计算,那将获得潜在的性能提升。