2017-09-27 41 views
-6

$a = 1會是怎樣表達的輸出echo ($a + $a++ + $a++)

+2

橡膠鴨它,你會弄明白 –

+0

從C(其中PHP在某種程度上是)衍生大多數語言會說這是*未定義行爲*。這完全取決於操作如何排序。 –

+2

這就是實際發生的情況:https://3v4l.org/sqCkW/vld#output – iainn

回答

3

這可能會更好用更短的例子來說明:

$a = 1; 
echo $a + $a++; 

這可能看起來像它應該等於2的遞增運算符($a++)返回變量的值,「之前」,所以應該返回1和1 + 1等於2

然而,實際發生的是$a++正在接受評估。所以後增量運算符運行,並返回1,但在其餘的評估發生時,$a已增加到2.因此,這最終評估2 + 1;

你舉的例子歸結爲:

  • 運行第一$a++,返回1 $ A現在是2;
  • 評估總和2 + 1(新$a值和從INCR後操作者的返回),返回3
  • 運行第二$a++(線的端部),增量之前返回2(的$a值)。 $ a現在是3;
  • 評估第二總和,3 + 2,返回5

總之,請不要寫這樣的代碼行。如果你想知道PHP如何在內部工作,他們是一個有趣的實驗,但它們不是直觀的。

修改添加: @納爾夫的下面評論也很重要。這是未定義的行爲,不應該依賴。事實上,答案確實在PHP < 5.1中有所不同。見https://3v4l.org/sqCkW

+1

這解釋了它如何工作* ed *,但不是一個明確的答案......看我的。 – Narf

+0

@Narf好點,更新 – iainn

3

operators precedence手冊明確表明以此爲未定義行爲的一個例子:

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

實例#評價2未定義順序

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