2015-04-01 42 views
5

我無法掌握下面列出的代碼中的評估邏輯。有誰知道爲什麼PHP在這種情況下評估$b$b = $b的方式不同嗎?

我已閱讀了SO的一些問題,並檢查了PHP manual。這樣做我已經瞭解「PHP不(在一般情況下)指定表達式評估的順序爲」「,該行爲可以在PHP版本之間或根據周圍代碼進行更改」 。我不覺得這適用於這種情況。還是呢?

作爲第一個承認這可能不是你的日常編碼問題,我仍然好奇。偶然想到做一些code golfing

$a = [[00, 01, 02, 03], 
     [10, 11, 12, 13], 
     [20, 21, 22, 23], 
     [30, 31, 32, 33]]; 

$b = 2; 
echo $a[$b][$b++], PHP_EOL; 

$b = 2; 
echo $a[$b=$b][$b++], PHP_EOL; 

輸出 - PHP 5.5.14:

32 
22 
+0

什麼PHP說的是,它不能保證像操作的數學秩序秩序。它可能在每個當前版本和系統中具有相同的順序,並且工作方式完全相同。他們表示,在更高版本中進行更改可能會改變結果,並且不能保證其始終如一。 – 2015-04-01 20:04:34

回答

10

這看起來像用來演示評價的未定義才能在manual的例子。從手冊:

運算符優先級和關聯性僅確定表達式的分組方式,它們不指定評估順序。 PHP不會(通常情況下)指定表達式的評估順序,應該避免假定特定評估順序的代碼,因爲PHP的各個版本之間的行爲可能會發生變化,或者取決於周圍的代碼。

着重強調

他們給出的例子:

<?php 
$a = 1; 
echo $a + $a++; // may print either 2 or 3 

$i = 1; 
$array[$i] = $i++; // may set either index 1 or 2 
?> 

你所得到的輸出你是因爲在第一個例子中,該指數$b++被確定第一,而在第二個索引$b=$b是第一個。

NB

至於爲什麼這是,我認爲一個原因是,本說明在同一手冊頁解釋:

儘管=比大多數其他優先級較低運算符,PHP仍然允許類似於以下的表達式:if(!$ a = foo()),在這種情況下,foo()的返回值被放入$ a中。

我相信他們錯過了至關重要的最後一個字有:第一(不,我讀書筆記失去位的含義的)。

根據PHP自己的規則,我們假設先進先出順序!$a應該先評估。如果$a目前是nullundefined,那麼!$a將等於true(它將被評估並且結果將被丟棄)。之後,foo()將被評估,並且其返回值將被分配給$a(即使我們假設爲FIFO,如果要將其結果分配給某個東西,則必須先評估foo())。此作業的結果將通過if進行評估,並且會導致作者想要的完全相反的值。

我沒有C專家,但有點搜索也導致了我這個answer它引用的是C90標準:

(C90,6.3)「除了由語法指示或更高版本另有規定(對於函數調用運算符(),& &,||,?,頓號,運營商)的子表達式的計算順序和順序副作用的發生都是unspecitied」

由於PHP它建立在C上,它可以繼承它的一些ecc entricities。

+0

因此,基本上在同一行上使用'$ b ++'和'$ b'就像巧克力的普通盒子。 – developerwjk 2015-04-01 20:07:40

+0

@developerwjk:哈哈:-P我會牢記這一點。 – mhall 2015-04-01 20:43:20

+0

我想也許PHP看到'$ b'和'$ b = $ b'等價,就像會優化愚蠢的任務一樣,但我猜測事情並非如此。 – mhall 2015-04-01 20:47:59

相關問題