2014-02-11 74 views
0

爲什麼PHP在邏輯AND返回FALSE時返回0,但當條件AND返回FALSE時不返回0?證人:爲什麼PHP在邏輯AND上不返回'0'作爲FALSE?

php > function a(){ 
php { echo "a"; 
php { return FALSE; 
php { } 

php > function b(){ 
php { echo "b"; 
php { return TRUE; 
php { } 

php > echo (a() && b())."\n"; 
a 
php > 

php > echo (a() & b())."\n"; 
ab0 
php > 

注意,第二echo語句0結束,但先不。爲什麼?

+0

它應該返回一個T_PARSE錯誤,因爲aa()是未定義的。 – Tularis

+0

您未測試返回值。您正在測試鑄造到字符串。 –

+0

你在這個鏈接中有一個解釋http://stackoverflow.com/questions/2376348/difference-between-and-in-php –

回答

5

&&返回一個布爾值。當轉換爲字符串時,布爾型false'',爲空字符串。
&是一個位和(不是一個「條件和」,無論這是什麼),作爲結果產生一個數字(或二進制blob,取決於參數)。在這種情況下,操作結果編號爲0

+0

這是不完全正確的。問題實際上是由短路造成的。雖然這會隱藏布爾值 – Tularis

+0

這是完全正確的。短路解釋了'a' /'ab',而不是'0'。 – deceze

+0

謝謝!你指出了我沒有意識到的三件事:1)有條件的和/或不是我認爲的那樣,2)我正在執行按位操作,以及3)TRUE和FALSE在轉換爲字符串時返回的值。試圖猜測其他語言(例如Python)如何將它們的布爾值轉換爲字符串也是很有啓發性的。 – dotancohen

2

在第二種情況下

php > echo (aa() & b())."\n"; 

是逐位AND。您需要使用&&進行比較

+1

正確。所以輸出是一個數字,而不是布爾值。 – arkascha

+0

是的,你是對的 –

0

其實,所提供的答案都不完全正確。正確的答案是三倍。

這裏的「問題」是& &是一個短路運營商。所以它基本上從最左邊的論點向右邊一個一個地移動。對於每一個它檢查它是否返回true,如果不是,它會停止並且不會執行下一個語句。 PHP Documentation on logical operators

Ergo:在第一種情況下,由於短路只能看到一個(而不是b)。然後你也看不到0,因爲它是一個布爾值(不是int)。

然後在第二種情況下,您會看到一個整數0,因爲他使用的是按位AND而不是邏輯。

+0

那麼?這是如何解釋「0」的存在與否的? – deceze

+0

正如第一個答案中所解釋的,缺少0。而在第二種情況下,它是由按位AND引起的,它返回一個int,如第二個答案所解釋的。 – Tularis

相關問題