预增量与后增量

时间:2011-06-19 04:19:48

标签: php reference increment

他们有什么不同?这就是我的想法,但我不确定......

如果你使用预增量,例如在带有++ j的for循环中,那么你基本上是这样说:“复制j的值以便在循环中使用,然后增加j,然后通过循环中带有j副本的语句。“如果你在相同的循环j ++中使用后递增,那么你基本上是这样说:“复制j的值以便在循环中使用,然后使用j的副本遍历循环中的语句,然后增加J“。

我不确定的原因是因为我创建了一个for循环,它将j的值乘以10,然后使用post和pre-increment输出j = 1到j = 12的结果。人类可读输出与后增量和预增量完全相同。我在想,'如果不涉及某种复制操作,输出如何完全相同?'

所以,我猜测前后增量的区别真的变得很重要,在php中,当我使用引用(在php中作为指针)而不是返回值的名称时?这是因为没有进行引用的复制,所以预先递增将是:“递增j,然后通过改变的j值循环遍历循环中的语句,然后再次递增j ...”,而后增量表示如下:“对循环中的语句使用j的值,然后更改j的值,然后使用j的新值进行循环...”

3 个答案:

答案 0 :(得分:23)

Pre- or post-incrementing直到以后才会神奇地推迟。它只是简单的内联速记。

enter image description here

// pre-increment
$var = 5;
print(++$var); // increments first, then passes value (now 6) to print()

// post-increment
$var = 5;
print($var++); // passes value (still 5) to print(), then increments

现在让我们来看一个循环。

for ($i = 0; $i < 9; $i++) {
    print($i);
}

循环声明的最后一部分($i++)只是每次循环后要执行的语句。它将值“传递”到无处,然后递增它。当时在任何地方都没有使用$i。稍后执行下一个语句(print($i);)时,$i的值已经增加。

// add 1, then do nothing with $i
for ($i = 0; $i < 9; ++$i) {}

// do nothing with $i, then add 1
for ($i = 0; $i < 9; $i++) {}

无论你采用哪种方式,$i在循环中都是相同的。


如果它有帮助,你可以把它们想象成这样做的小例程:

// ++$i
{
    $i = $i + 1;
    return $i;
}

// $i++
{
    return $i;
    $i = $i + 1;
}

当我重读你的问题时,我认为混淆更多的是循环如何工作而不是增量运算符的工作方式。请记住,增量是一个简单的,一次性操作,这是循环中第三个表达式的工作原理。

// here's a basic loop
for ($i = 0; $i < 9; $i++) {
    // do loop stuff
    print($i);
}

// this is exactly what happens
for ($i = 0; $i < 9; ) {
    // do loop stuff
    print($i);

    $i++;
}

只是因为最后一行可以放在循环声明中并没有赋予它任何特殊的权力。幕后没有任何参考或任何使用。在循环内部和外部都可以看到相同的$i变量。循环内部或外部的每个语句在必要时直接查找$i的值。而已。没有好笑的事。

答案 1 :(得分:1)

执行$x++时,您将进行后递增...这意味着递增仅在语句被评估之后发生。

所以,给出以下代码:

$x = 10; $y = 0; $z = 5;

$y = $z * $x++;

PHP这样做:

$x = 10; $y = 0; $z = 5;

$y = $z * $x++;

// Ignore Post-Increment, Evalutate
$y = $z * $x;
$y = 5 * 10;

// Now Increment x - POST-INCREMENT
$x = $x + 1;
$x = 10 + 1;
$x = 11;

// Continue evaluating statement
$y = 5 * 10;
$y = 50;

执行++$x时,您正在预先递增...这意味着递增将在评估语句之前发生:

$x = 10; $y = 0; $z = 5;

$y = $z * ++$x;

// Do Pre-Increment
$x = $x + 1;
$x = 10 + 1;
$x = 11;

// Evaluate
$y = $z * $x;
$y = 5 * 11;
$y = 55;

对于PHP中的for循环,PHP按如下方式评估for循环:

for($i = 0; $i < 30; $i++) {
  doSomething();
}

// Is evaluated EXACTLY as such by PHP

$i = 0;
while($i < 30) {
  doSomething();

  $i++;
}

第一个表达式($i = 0)在循环开始时无条件地计算(执行)一次。

在每次迭代开始时,将评估$i < 30。如果它的计算结果为TRUE,则循环继续并执行嵌套语句。如果计算结果为FALSE,则循环的执行结束。

在每次迭代结束时,$i++被评估(执行)为独立表达式。

因此,将变量后递增或预递增作为循环中的第三个表达式对其行为没有影响。在这个简单的情况下,两个表达式将表现完全相同

但是,在如下的复杂循环中:

for($i = $j = 0; $i < 30; $i += ++$j) {
  $j = getResult($j);
}

根据上面的示例,后递增或预递增$j会直接影响$i的值。在这种情况下,您需要准确选择您想要做的事情。

答案 2 :(得分:0)

$i = 0;
echo $i++;
echo $i;
$j=0;
echo ++$j;
echo $j;

预增量显示增量值。但是后增量显示值然后增加。关于代码将输出01和11