PHP短路運算符

先看一段代碼

$a = 5; $b = 20;
if ($a = 10 || $b = 7) {
    $a++;
    $b++;
}
echo $a,"\n","",$b; //1 21

剛開始接觸可能一眼看過去很容易說出最後的輸出是5 20 可是仔細看後()裏的條件表達式是賦值操做,因此應該輸出11 21.可是計算機和咱們開了一個並很差笑的玩笑。她妹的,最後居然輸出的是1 21php

計算機的思路和人腦的思路是有區別的,在編程的時候必須瞭解計算機的思惟模式:機械式的思惟模式。咱們人在判斷這個邏輯表達式的時候會跳躍性的先對$a$b賦值,而後再作與運算,這樣作雖然不影響邏輯運算的結果,可是也會產生上面這種反作用。事實上,計算機爲了節省資源,採起了短路運算的方式解釋這個邏輯表達式。當他發現與運算符的前一個數值(例如$a)是false時,他就會判斷這個與運算表達式的運算結果是false,而後跳出這個邏輯運算表達式,繼續執行下面的程序,而不會執行表達式剩下的語句。編程

至於這裏爲何$a的值是1? 是由於在條件表達式的時候$a = 10的操做的時候php會把$a轉換成boolean。上面的例子中$a = 10即轉換成了true.因此在{}中的$a++ 是不能進行加法運算的。可是若是花括號中的$a++換成$a = $a + 1 那麼此時就能夠進行數值運算了。code

短路運算的精髓就是
邏輯與(&&)->檢查運算符第一個表達式是否爲false,若是false直接返回false,後續的表達式直接忽略。
邏輯或(||)->檢查運算符第一個表達式是否爲true,若是是true直接返回true,後續表達式直接忽略。
PS:&&的優先級高於and、||的優先級高於or、等號(=)的優先級高於andor資源

補充

php<?php

// 下面的 foo() 不會被調用,由於它們被運算符「短路」了。
$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

// "||" 的優先級比 "or" 高
$e = false || true; // $e 被賦值爲 (false || true),結果爲 true
$f = false or true; // $f 被賦值爲 false [Altair注:"=" 的優先級比 "or" 高]
var_dump($e, $f);

// "&&" 的優先級比 "and" 高
$g = true && false; // $g 被賦值爲 (true && false),結果爲 false
$h = true and false; // $h 被賦值爲 true [Altair注:"=" 的優先級比 "and" 高]
var_dump($g, $h);
?>

//以上例程的輸出相似於:
bool(true)
bool(false)
bool(false)
bool(true)
相關文章
相關標籤/搜索