更新時(shí)間:2018-10-26 來源:黑馬程序員 瀏覽量:
$temp=$i;
$i=$i+1;
$j=$temp;
并以此推斷出了$i=$i++的正確結(jié)果,但是同學(xué)們?nèi)匀蛔霾粚?duì)下面的幾道題目:
① $i=2; $j= $i+$i + $i++ * ++$i; echo $j; //結(jié)果是多少?
② $i=2; $j= $i + $i++ * ++$i; echo $j; //結(jié)果是多少?
③ $i=2; $j=(++$i)+(++$i); echo $j; //結(jié)果是多少?
④ $i=2; $q=&$i;$j=(++$i)+(++$i);echo $j; //結(jié)果是多少?
⑤ $i=2; $j=($i++)+($i++); echo $j; //結(jié)果是多少?
⑥ $i=2; $q=&$i; $j=($i++)+($i++); echo $j; //結(jié)果是多少?
以上6個(gè)題目,幾乎大部分同學(xué)都能做出來第①個(gè),可是后面的題目基本都是全軍覆沒,我來先公布一下答案,然后逐一講解。答案如下:
① 12;② 12;③ 7;④ 8;⑤ 5;⑥ 5;
關(guān)于①和②上一講已經(jīng)講過,在此不多說。重點(diǎn)說一下③④和⑤⑥。
對(duì)于③,很顯然,第一個(gè)++$i為3,第二個(gè)++$i為4,其和為7;但是④為什么結(jié)果不一樣了呢?因?yàn)橐粋€(gè)變量一旦被引用(即此處的$i),他返回的不再是內(nèi)存區(qū)域里對(duì)應(yīng)的那個(gè)值,而是返回指向那片內(nèi)存的地址,直到符合運(yùn)算規(guī)則時(shí)才從那片地址取值出來參與運(yùn)算,因此,對(duì)于④,第一個(gè)++$i返回的并不是運(yùn)算結(jié)果3,而是返回$i的地址,此時(shí)他的值是3,但是由于后面一個(gè)是++$i,在執(zhí)行加法運(yùn)算之前先執(zhí)行++$i,執(zhí)行++$i,然后返回$i的地址,此時(shí)$i指向的那片內(nèi)存已經(jīng)變成了4,于是兩個(gè)4相加得8.
于是有同學(xué)用上面的理論去推斷⑥應(yīng)該為7,但是為什么還是5呢,這就要再說明一下$i++了,$i++返回的是變量沒有加1之前的”值”而不再是變量,而且這個(gè)值存的地方與$i變量存的也不是同一個(gè)地方,自然不會(huì)變化,故即使變成引用也是如此,故⑥為5,自然⑤也是5,這個(gè)大家還是都能理解的。
題目講完了,大家什么感覺?是不是突然覺得自己以前理解的太膚淺?突然連$i++和++$i都搞不定了?其實(shí),本節(jié)課的目的是讓大家深入認(rèn)識(shí)一下自增運(yùn)算(自減也是一樣的),提醒大家以后不要寫那些復(fù)雜的自增自減運(yùn)算而是只在簡(jiǎn)單場(chǎng)景下使用他們。
作者:黑馬程序員PHP培訓(xùn)學(xué)院
首發(fā):http://php.itheima.com/