2017-10-20 252 views
3

的PHP優先,我讀了=and運營商

更高的優先級比方說,你有

$boolone = true; 
$booltwo= false; 
$res = $boolone and $booltwo; 

我已經猜到這會變成假的,因爲$res = true and false其中真假等於假。但由於=具有更高的優先級,它應該是真實的。這是這樣的

($res = $boolone) and $booltwo; 

這將返回true,但我的問題是爲什麼它返回true,它不應該返回false?由於$res = $boolone等於true$booltwo默認爲false,所以我們有這樣的:true and false這通常應該返回false,但是爲什麼又是true?

簡單地說:

($res = $boolone) and $booltwo; 
(true) and false; //returns true? 
+0

如果這是爲了實際的實際目的,請嘗試'$ res = $ boolone && $ booltwo;' – mega6382

+0

@ mega6382我只是想了解它背後的理論。不實用(還) – KoyaCho

回答

8

你是正確的,

$res = $boolone and $booltwo; 

相當於

($res = $boolone) and $booltwo; 

由於運算符優先級,

$res = $boolone 

先評估,與$boolone值分配給$res ....

$booltwo然後與第一次評估結果(true and false)的結果and版,但你什麼都不做與評價,所以它被簡單地丟棄...它沒有被分配到$res,因爲該分配已經由第一次評估完成。

如果你

var_dump($res = $boolone and $booltwo); 

然後你會看到被丟棄的全面評估的結果,並$res仍然true

+0

很好的答案'+ 1' –

+0

@MarkBaker謝謝你的好和詳細的答案。但是,您的意思是我們對該評估沒有做任何事情? – KoyaCho

+0

'$ res = $ boolone和$ booltwo'被評估.....那麼評估的結果會發生什麼?沒有!除非你在我的答案中顯示'var_dump()'的東西,它顯示結果;或'$ res2 =($ res = $ boolone和$ booltwo);',它將完整表達式的結果賦值給'$ res2'('$ boolone'仍然總是賦給'$ res')....那麼你對評估的最終結果並沒有做任何事情 –

0

你錯在這裏:

這返回true,但我的問題是爲什麼它返回true, 不應該返回false?

那麼,它不會返回true。它返回false。可能您誤認爲(true) and false的結果與$res的內容等於($res = $boolone)。您沒有將結果(true) and false分配給$res

2

我使用PHP 5.6.30進行了測試,但是我沒有得到結果,暗示=綁定比&&更緊密。

<?php 
$boolone = true; 
$booltwo = false; 

var_dump($res = ($boolone && $booltwo)); 
var_dump($res); 

var_dump($res = $boolone && $booltwo); 
var_dump($res); 

var_dump(($res = $boolone) && $booltwo); 
var_dump($res); 

輸出:

bool(false) // $res = ($boolone && $booltwo) ... $res = (true && false) 
bool(false) // $res after assignment is false 

bool(false) // $res = $boolone && $booltwo ... $res = true && false 
bool(false) // $res after assignment is false 

bool(false) // ($res = $boolone) && $booltwo ... ($res = true) && false 
bool(true) // $res after assignment is true 

結論:

分配綁定默認比&&更緊。你必須使用parens來覆蓋它。

更新:正如@Piyin在評論中指出的,&&與PHP中的and不一樣。頁面https://secure.php.net/manual/en/language.operators.precedence.php顯示它們落在運算符優先級層次結構中的兩個不同位置。

https://secure.php.net/manual/en/language.operators.logical.php狀態:

其原因的兩個不同的變體「和」和「或」運算符是,它們在不同的優先級操作。 (請參閱Operator Precedence。)

+1

你是對與錯。你正在用'&&'而不是'和'來測試。相關信息:http://php.net/manual/en/language.operators.precedence.php兩項測試都加入了:https://3v4l.org/iLrsH – Piyin

+1

@Piyin,謝謝,不錯的提示!我已經更新了我的答案。 –