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,所以沒必要繼續計算剩餘的表達式,那樣只是浪費

“短路”一詞的由來正源於此。

事實上,如果所有的邏輯表達式都有一部分不必計算,那將獲得潛在的性能提升。

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