首頁技術文章正文

你真的理解$i++嗎---之二

更新時間:2018-10-26 來源:黑馬程序員 瀏覽量:

在之前的文章中,我們講解了$j=$i++的執(zhí)行過程是這樣的:

$temp=$i;

$i=$i+1;

$j=$temp;

并以此推斷出了$i=$i++的正確結果,但是同學們?nèi)匀蛔霾粚ο旅娴膸椎李}目:

① $i=2; $j= $i+$i + $i++ * ++$i; echo $j;  //結果是多少?

② $i=2; $j= $i   + $i++ * ++$i; echo $j;  //結果是多少?


③ $i=2; $j=(++$i)+(++$i);     echo $j;  //結果是多少?

④ $i=2; $q=&$i;$j=(++$i)+(++$i);echo $j;  //結果是多少?


⑤ $i=2; $j=($i++)+($i++);     echo $j;  //結果是多少?

⑥ $i=2; $q=&$i; $j=($i++)+($i++);     echo $j;  //結果是多少?

以上6個題目,幾乎大部分同學都能做出來第①個,可是后面的題目基本都是全軍覆沒,我來先公布一下答案,然后逐一講解。答案如下:

① 12;② 12;③ 7;④ 8;⑤ 5;⑥ 5;

關于①和②上一講已經(jīng)講過,在此不多說。重點說一下③④和⑤⑥。

對于③,很顯然,第一個++$i為3,第二個++$i為4,其和為7;但是④為什么結果不一樣了呢?因為一個變量一旦被引用(即此處的$i),他返回的不再是內(nèi)存區(qū)域里對應的那個值,而是返回指向那片內(nèi)存的地址,直到符合運算規(guī)則時才從那片地址取值出來參與運算,因此,對于④,第一個++$i返回的并不是運算結果3,而是返回$i的地址,此時他的值是3,但是由于后面一個是++$i,在執(zhí)行加法運算之前先執(zhí)行++$i,執(zhí)行++$i,然后返回$i的地址,此時$i指向的那片內(nèi)存已經(jīng)變成了4,于是兩個4相加得8.

于是有同學用上面的理論去推斷⑥應該為7,但是為什么還是5呢,這就要再說明一下$i++了,$i++返回的是變量沒有加1之前的”值”而不再是變量,而且這個值存的地方與$i變量存的也不是同一個地方,自然不會變化,故即使變成引用也是如此,故⑥為5,自然⑤也是5,這個大家還是都能理解的。

題目講完了,大家什么感覺?是不是突然覺得自己以前理解的太膚淺?突然連$i++和++$i都搞不定了?其實,本節(jié)課的目的是讓大家深入認識一下自增運算(自減也是一樣的),提醒大家以后不要寫那些復雜的自增自減運算而是只在簡單場景下使用他們。


作者:黑馬程序員PHP培訓學院
首發(fā):http://php.itheima.com/

分享到:
在線咨詢 我要報名
和我們在線交談!