你可能不知道的PHP加減法

這可能算不上是一次正規的解說,畢竟有點燒腦。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。

詭異的1

爲了給隱形括號作個最終的定論,咱們再看一個燒腦例子

$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。你知道爲何嗎?

相關文章
相關標籤/搜索