首页技术文章正文

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

更新时间:2018-10-26 来源:黑马程序员 浏览量:

在之前的文章中,我们讲解了$j=$i++的执行过程是这样的:

$temp=$i;

$i=$i+1;

$j=$temp;

并以此推断出了$i=$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;

关于①和②上一讲已经讲过,在此不多说。重点说一下③④和⑤⑥。

对于③,很显然,第一个++$i为3,第二个++$i为4,其和为7;但是④为什么结果不一样了呢?因为一个变量一旦被引用(即此处的$i),他返回的不再是内存区域里对应的那个值,而是返回指向那片内存的地址,直到符合运算规则时才从那片地址取值出来参与运算,因此,对于④,第一个++$i返回的并不是运算结果3,而是返回$i的地址,此时他的值是3,但是由于后面一个是++$i,在执行加法运算之前先执行++$i,执行++$i,然后返回$i的地址,此时$i指向的那片内存已经变成了4,于是两个4相加得8.

于是有同学用上面的理论去推断⑥应该为7,但是为什么还是5呢,这就要再说明一下$i++了,$i++返回的是变量没有加1之前的”值”而不再是变量,而且这个值存的地方与$i变量存的也不是同一个地方,自然不会变化,故即使变成引用也是如此,故⑥为5,自然⑤也是5,这个大家还是都能理解的。

题目讲完了,大家什么感觉?是不是突然觉得自己以前理解的太肤浅?突然连$i++和++$i都搞不定了?其实,本节课的目的是让大家深入认识一下自增运算(自减也是一样的),提醒大家以后不要写那些复杂的自增自减运算而是只在简单场景下使用他们。


作者:黑马程序员PHP培训学院
首发:http://php.itheima.com/

分享到:
在线咨询 我要报名
和我们在线交谈!