2012-02-18 24 views
2

我遇到了增量运算符的一个奇怪问题。下面的代码应该输出什么?

$j = 0; 
for ($i=0; $i<100; $i++) 
{ 
    $j = $j++; 
} 
echo $j; 

它回声0为什么不是100?


编辑:当我改变$j = $j++$j = ++$j到,它呼应100

+2

您正在使用后缀增量,它会在增量前分配变量的值。所以'$ j' = 0每次。 '++ $ j'会在赋值之前进行递增。当然,你可以完全跳过作业,并自己做'$ j ++'... – Interrobang 2012-02-18 02:46:16

+0

这将是一个很好的面试问题。 – Umbrella 2012-02-18 02:51:30

+0

@伞:这可能是一个很好的电话屏幕问题,以帮助您决定是否值得邀请候选人在现场。 – 2012-02-18 17:43:00

回答

7

你正在做一个“后增量”,因为++出现在它正在修改的变量之后。该代码,在更短的紧凑的形式写出来,可以归结为:

for ($i = 0; $i < 100; $i++) { 
    $temp = $j; // store j 
    $j = $j + 1; // $j++ 
    $j = $temp; // pull original j out of storage 
} 

如果你有++$j,则j将首先增加,产生的增加值将被分配回J.然而,这样的结构使很少有意义。你可以简单地写出来

for (...) { 
    $j++; 
} 

其归结为

for (...) { 
    $j = $j + 1; 
} 
+0

感谢Marc B,你解决了我的困惑,$ j ++先存储了值,所以它变成了0最后。当使用++ $ j时,它首先添加值! – steve 2012-02-18 02:55:28

6

的问题是与线

$j = $j++; 

该命令评估$j为0,然后递增$j为1,最后把0赋值回$j

可以使用$j = $j + 1;或者只是$j++;

+1

或者只是做$ j = ++ $ j;' – 2012-02-18 02:46:16

+3

@AaronW。这会起作用,但这是多余的和混乱的。我的团队永远不会允许它通过代码审查。 – 2012-02-18 02:47:40

3

$j++是后递增:表达式的值是$j,然后$j递增。所以你得到j的值,然后递增j,然后将j设置为j的原始值。