最近我在一則這樣的段落中發現了它:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y; pre>該程式碼片段生產輸出 1:3。透過查看運算子優先級表,我發現邏輯運算子||和&&具有比賦值運算子=更高的優先權。因此,第一個表達式應該被視為$x = ($y || 2) = 3;這使得$x = (2 && $y) = 3;,最後評估為$x = false = 3;。其次,賦值運算子具有右置序性,所以解釋器應該嘗試執行false = 3,這是顯然非法的。所以,在我看來,上述提到的程式碼片段應該無法編譯,並且應該拋出解析或執行時錯誤。但是,相反,但程式碼片段生產了1:3。這意味著解釋器執行的操作是:
a) $y=3
b) 2 && $y
c) $x = (2 && $y)
為什麼要這樣做而不是根據運算符優先級?
您提供的運算子優先級表格中作為一個單獨的註釋指出:
因此,實際上,在表達式中的賦值將被視為一個子表達式。具體的處理方式和時間並沒有在文件中明確說明,文件只是指出「類似」的表達式會以這種方式運作。
#