$a = 1;
$b = &$a; //傳址。註解掉此行回傳5,不註解時(PHP版本<7的)回傳6
$c = ( $a) ( $a);
echo $c;
跟版本有關係嗎?還有就是結果是6啊,百思不得其解啊
typecho2017-06-21 10:12:41
$b = &$a;
這個操作,可以認為,$a
和$b
都指向原本$a
變量所在的那塊內存(為了方便後面解釋,稱為內存X
),也就是說,後面任何對於$a
或$b
的操作,都是在直接對這塊記憶體裡的數值進行修改。
所以加上這一行之後的運作流程:
前面步驟省略,初始a為1
$c = (++$a) + (++$a)
的兩次++$a
都是在操作記憶體X
,也就是把記憶體X
裡的值自增了兩次,所以,在運算$c的值的時候,取的是這個記憶體裡數的值,也就是自增了兩次之後的記憶體X
裡的值。所以,是3 + 3 = 6
(運算$c
時候,記憶體X
裡存的值是3)。
如果不加引用,那麼對於$a
的自增接操作直接修改內存X
,而後通過運算符操作返回內存X的副本
,這樣,兩次的++$a
結果由於不是直接從記憶體X
取得的,而是改變記憶體X
值之後的副本,所以$c
在運算的時候就是2 + 3 = 5
。
phpcn_u15822017-06-21 10:12:41
這個跟PHP的底層實現有關,說起來很長,推薦看一下github上同樣問題的解析
一個PHP bug引發的探索:
https://github.com/xurenlu/ph...