這可能算不上是一次正規的解說,畢竟有點燒腦。php
是這樣的,咱們都知道php語法裏有自增操做,即 ++,那麼下面我列出一個表達式code
$a = 1; $result = $a + $a++; // $result === 3
好的,爲何等於3?只有一種解釋,就是自增的優先級高於加減,因此二號位自增致使了一號位也變成2。(3 = 2 + 1)class
既然一號位變成了2,爲什麼二號位不會變成2呢?由於後置自增的返回值僅是臨時變量,這點和 C/C++是一致的,畢竟PHP也是基於C實現的。變量
換個寫法語法
$a = 1; $result = $a + ++$a; // $result === 4
彷佛驗證了剛纔的解釋。因爲是前置自增,因此二號位本身的值也變成了2。(4 = 2 + 2)co
接下來,咱們把數量增長到3個
$a = 1; $result = $a + ++$a + ++$a; // $result === 7
爲何是7?按照思路,應該是 9 = 3 + 3 + 3,也是醉了,並無按照常理出牌。
增長到4個呢
$a = 1; $result = $a + ++$a + ++$a + ++$a; // $result === 11
答案也不是 16 = 4 + 4 + 4 + 4,好吧,和我想的不同。
既然2個$a相加能夠正確推算,而3個開始就出錯,爲什麼?因而有了一個猜想,PHP是這樣相加的
$a = 1; $result = ( ( $a + ++$a ) + ++$a ) + ++$a; // $result === 11
優先級順序 () > ++ > +
,11 = ( ( 2 + 2 ) + 3 ) + 4,每跳出一層,$a都自增了1。
有括號和沒有括號的運算,最終運算結果都是11,我有點確信隱形括號這個事實。
因而我只讓最後一個$a是自增的
$a = 1; $result_a = $a + $a + $a + ++$a; // $result_a === 5 $a = 1; $result_b = ( ( $a + $a) + $a ) + ++$a; // $result_b === 5
好的,$result_a 和 $result_b 的值是同樣的。5 = ( ( 1 + 1 ) + 1 ) + 2
咱們此時加入後置
自增,看看結果會不會同樣
$a = 1; $result_a = $a + $a + $a++ + ++$a; // $result_a === 6 $a = 1; $result_b = ( ( $a + $a) + $a++ ) + ++$a; // $result_b === 6
是的,遵循了隱形括號的規則, 6 = ( ( 1 + 1) + 1 ) + 3。
爲了給隱形括號作個最終的定論,咱們再看一個燒腦例子
$a = 1; $result_a = $a + ++$a + ++$a; // $result_a === 7 $a = 1; $result_b = 1 + $a + ++$a + ++$a; // $result_b === 7
不不不,你沒有看錯,$result_b的前面真的多了一個1。可是,它們的值都是7。你知道爲何嗎?