2014-06-14 24 views
1

這裏邏輯運算符&&是代碼關於在PHP

$a = 2; 
$a && $a = 1; 

var_dump($a); // result 1 

爲什麼$ a爲1?

根據該文件,邏輯運算符「& &」具有更大的優先級比賦值運算符,它應該被解釋爲($一個& & $ A)= 1,則應該有一個語法錯誤。

+5

那麼,你期望*會發生什麼? –

+0

@NiettheDarkAbsol:我本來希望能給出某種錯誤! –

+0

@NiettheDarkAbsol作爲文檔,它應該被解釋爲($ a && $ a)= 1,那麼應該有一個語法錯誤 –

回答

4

documentation

注:
雖然=比大多數其他優先級高,PHP仍舊允許表達式類似於以下內容:if (!$a = foo()),在這種情況下,返回值foo()被放入$a

文檔沒有指定哪些規則遵循在這一點,但我們可以推斷出你的代碼是相同的:

$a && ($a = 1) 

因爲&&是「懶」,因爲它贏得了」如果它發現一個錯誤,那麼就意味着$a只會被設置爲1,如果它以前保持真實值(在你的情況下,2是truthy)。如果你已經設置了$a = 0那麼它應該保留0

+1

我不認爲這裏的「也」引用有任何關聯;評估順序和優先級通常是不相關的主題。 –

+0

@OliCharlesworth我認爲這有助於強調評估的順序可能並不總是準確,但我可能會解釋錯誤。 –

+0

優先級是關於如何構建[AST](http://en.wikipedia.org/wiki/Abstract_syntax_tree)。第二個引用是指像'a()+ b()'這樣的東西;它沒有定義首先評估(即調用)「a」還是「b」。 –

2

它的編寫方式,你說同樣的事情,因爲這

$a = 2; 
if($a) $a = 1; 

由於2東西,它成功並改變$a爲1

那麼它爲什麼要這樣做?你有一個聲明$a = 2;這裏沒有任何操作順序,所以PHP會處理它。經營秩序在第二項聲明中生效。請記住,$a是SOMETHING,(即truthy)。讓我們稍微改變你的代碼

$a = 0; 
$a && $a = 1; 
echo $a; 

正如你所看到的,$a現在是虛假的。因此,爲了防止更改值的腳本,該腳本輸出0

+0

但是,正如OP所說,'&&'[應該](http:// www .php.net // manual/en/language.operators.precedence.php)的優先級高於賦值。因此,OP的代碼應該等於'($ a && $ a)= 1;'。 –

+0

@OliCharlesworth它是否有任何區別,那不是有效的代碼?對我來說這沒有意義。 –

+0

@WesleyMurch:也許吧。那麼PHP運算符的規則是:「遵循優先級表,除非導致某些無意義的東西,在這種情況下,嘗試...其他東西」? –

0
$a && $a = 1; 

是布爾類型的表達式。由於$a是真的,表達式的評價繼續到第二部分,這是任務。作爲該作業的副作用,$a現在持有1

如果$a在開始時爲0,則最終將保持爲0,因爲在測試第一個條件之後立即終止對expression的評估。

+0

根據定義,子表達式與運算符的綁定根據定義與優先級。 –

+0

的確,「沒有任何關係」是誇張的。但是,表達式被評估爲$ a &&($ a = 1),而不是將$ a && $ a解釋爲左值的事實並不是因爲運算符的優先級,而是看起來更像lika,因爲左值是「後備」無效。 – usoban