這裏邏輯運算符&&是代碼關於在PHP
$a = 2;
$a && $a = 1;
var_dump($a); // result 1
爲什麼$ a爲1?
根據該文件,邏輯運算符「& &」具有更大的優先級比賦值運算符,它應該被解釋爲($一個& & $ A)= 1,則應該有一個語法錯誤。
這裏邏輯運算符&&是代碼關於在PHP
$a = 2;
$a && $a = 1;
var_dump($a); // result 1
爲什麼$ a爲1?
根據該文件,邏輯運算符「& &」具有更大的優先級比賦值運算符,它應該被解釋爲($一個& & $ A)= 1,則應該有一個語法錯誤。
注:
雖然=
比大多數其他優先級高,PHP仍舊允許表達式類似於以下內容:if (!$a = foo())
,在這種情況下,返回值foo()
被放入$a
。
文檔沒有指定哪些規則遵循在這一點,但我們可以推斷出你的代碼是相同的:
$a && ($a = 1)
因爲&&
是「懶」,因爲它贏得了」如果它發現一個錯誤,那麼就意味着$a
只會被設置爲1
,如果它以前保持真實值(在你的情況下,2
是truthy)。如果你已經設置了$a = 0
那麼它應該保留0
。
我不認爲這裏的「也」引用有任何關聯;評估順序和優先級通常是不相關的主題。 –
@OliCharlesworth我認爲這有助於強調評估的順序可能並不總是準確,但我可能會解釋錯誤。 –
優先級是關於如何構建[AST](http://en.wikipedia.org/wiki/Abstract_syntax_tree)。第二個引用是指像'a()+ b()'這樣的東西;它沒有定義首先評估(即調用)「a」還是「b」。 –
它的編寫方式,你說同樣的事情,因爲這
$a = 2;
if($a) $a = 1;
由於2
是東西,它成功並改變$a
爲1
那麼它爲什麼要這樣做?你有一個聲明$a = 2
;這裏沒有任何操作順序,所以PHP會處理它。經營秩序在第二項聲明中生效。請記住,$a
是SOMETHING,(即truthy)。讓我們稍微改變你的代碼
$a = 0;
$a && $a = 1;
echo $a;
正如你所看到的,$a
現在是虛假的。因此,爲了防止更改值的腳本,該腳本輸出0
但是,正如OP所說,'&&'[應該](http:// www .php.net // manual/en/language.operators.precedence.php)的優先級高於賦值。因此,OP的代碼應該等於'($ a && $ a)= 1;'。 –
@OliCharlesworth它是否有任何區別,那不是有效的代碼?對我來說這沒有意義。 –
@WesleyMurch:也許吧。那麼PHP運算符的規則是:「遵循優先級表,除非導致某些無意義的東西,在這種情況下,嘗試...其他東西」? –
$a && $a = 1;
是布爾類型的表達式。由於$a
是真的,表達式的評價繼續到第二部分,這是任務。作爲該作業的副作用,$a
現在持有1
。
如果$a
在開始時爲0,則最終將保持爲0,因爲在測試第一個條件之後立即終止對expression的評估。
根據定義,子表達式與運算符的綁定根據定義與優先級。 –
的確,「沒有任何關係」是誇張的。但是,表達式被評估爲$ a &&($ a = 1),而不是將$ a && $ a解釋爲左值的事實並不是因爲運算符的優先級,而是看起來更像lika,因爲左值是「後備」無效。 – usoban
那麼,你期望*會發生什麼? –
@NiettheDarkAbsol:我本來希望能給出某種錯誤! –
@NiettheDarkAbsol作爲文檔,它應該被解釋爲($ a && $ a)= 1,那麼應該有一個語法錯誤 –