Day8-26.Logical operators

逻辑操作符


逻辑操作符&& || ! 能根据参数的逻辑关系,生成一个布尔值(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,所以没必要继续计算剩余的表达式,那样只是浪费

“短路”一词的由来正源于此。

事实上,如果所有的逻辑表达式都有一部分不必计算,那将获得潜在的性能提升。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章