PHP學習筆記運算子優先順序

來源:互聯網
上載者:User

今天在老王的技術手冊看到一個問題:

 代碼如下 複製代碼
<?phpif ($a = 100 && $b = 200) {     var_dump($a, $b);}

輸出是什麼?

這個問題, 咋一看或許覺得簡單, 但其實仔細推敲並不簡單,

如果說布爾與之前的部分, 是由於優先順序的問題, 但是如果僅僅是優先順序的問題的話, 那麼結果應該是:

 代碼如下 複製代碼
$a = (100 && $b) = 200

而實際上的結果, 確實高優先順序的&&讓步給次優先順序的=, 讓 $b = 200 先結合了.

究其原因, 是因為PHP並不完全遵守優先順序的定義, 這個在PHP的手冊中也有說明:

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

這樣的設計, 個人不發表看法, 反正在C語言中, 這樣類似的語句是判定為文法錯的. PHP採用這樣的設計, 很可能是曆史原因,

有好奇的同學, 會想知道到底為什麼, 之前jayeeliu網友也問過:

laruence你好:

問一個php運算子優先順序的問題

 代碼如下 複製代碼

$t == 1 && $tt = 2

按照php運算子優先順序應該是

 代碼如下 複製代碼

(($t == 1) && $tt) = 2

這個順序執行,但實際上應該是

 代碼如下 複製代碼

($t == 1) && ($tt = 2)

我有些不太理解。

其實也簡單, 運算子優先順序是在存在二義性文法的時候的一種規約規則選擇的手段, 而PHP的文法分析檔案定義中, 卻讓等號和T_BOOLEAN_AND(&&)之前不存在了規約衝突:

 代碼如下 複製代碼

expr_without_variable: 
// 有隱規則存在, 相當於T_BOOLEAN_AND成為了"一元操作符". 
|   expr T_BOOLEAN_AND  { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } exp

最後, 順便說一下, PHP對應於T_BOOLEAN_AND 還定義了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 這倆個的優先順序都低於等號, 於是就會有了, 很多PHP入門教材範例程式碼中經典的:

 代碼如下 複製代碼

$result = mysql_query(*)  or die(mysql_error());

類似的還可以用or來實現三元操作符(?:)的功能:

 代碼如下 複製代碼

$person = $who or $person = "laruence";

//等同於:    

 代碼如下 複製代碼

$person = empty($who)? "laruence" : $who;

結合方向

運算子
,
or
xor
and
print
= += -= *= /= .= %= &= |= ^= ~= <<= >>=
? :
||
&&
|
^
&
== != === !==
< <= > >=
<< >>
+ - .
* / %
! ~ ++ -- (int) (float) (string) (array) (object) @
[
new

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.