首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递增前与递增后

递增前与递增后
EN

Stack Overflow用户
提问于 2011-06-19 12:19:48
回答 3查看 11.6K关注 0票数 6

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

如果您使用预增量,例如在带有++j的for循环中,那么您基本上是在说:“复制j的值以用于循环,然后递增j,然后使用j的副本遍历循环中的语句。”如果您在相同的循环j++中使用后增量,那么您基本上是在说:“复制j的值以用于循环,然后使用j的副本遍历循环中的语句,然后递增j。”

我不确定的原因是,我已经创建了一个for循环,它将j的值乘以10,然后使用后增量和前增量通过j=12输出j=1的结果。人类可读的输出与后增量和前增量完全相同。我在想,‘如果不涉及某种复制操作,输出怎么会完全一样?’

所以,我猜在php中,当我使用引用(在php中充当指针)而不是名称作为返回值时,前后增量之间的区别真的变得很重要了?这是因为没有创建引用的副本,所以前增量将是:“增量j,然后使用更改后的j值遍历循环中的语句,然后再次递增j...”,而后增量将如下所示:“将j的值用于循环中的语句,然后更改j的值,然后使用新的j值遍历循环……”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-19 12:30:33

Pre- or post-incrementing不会神奇地将事情推迟到以后。这只是一种简单的内联速记。

代码语言:javascript
复制
// 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

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

代码语言:javascript
复制
for ($i = 0; $i < 9; $i++) {
    print($i);
}

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

代码语言:javascript
复制
// 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都是相同的。

如果有帮助的话,你可以把它们看作是一些小的例程来做这件事:

代码语言:javascript
复制
// ++$i
{
    $i = $i + 1;
    return $i;
}

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

当我重读你的问题时,我认为更多的困惑在于循环是如何工作的,而不是增量操作符是如何工作的。记住,增量是一个简单的一次性操作,下面是循环中第三个表达式的工作方式。

代码语言:javascript
复制
// 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的值。就这样。没什么好笑的。

票数 27
EN

Stack Overflow用户

发布于 2011-06-19 12:32:07

在做$x++的时候,你是在递增...这意味着只有在对语句求值之后才会进行递增。

因此,给定以下代码:

代码语言:javascript
复制
$x = 10; $y = 0; $z = 5;

$y = $z * $x++;

PHP可以做到这一点:

代码语言:javascript
复制
$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时,您是在预先递增...这意味着递增将在语句求值之前发生:

代码语言:javascript
复制
$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循环的结果如下:

代码语言:javascript
复制
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++作为一个独立的表达式进行计算(执行)。

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

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

代码语言:javascript
复制
for($i = $j = 0; $i < 30; $i += ++$j) {
  $j = getResult($j);
}

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

票数 1
EN

Stack Overflow用户

发布于 2016-01-29 20:53:48

代码语言:javascript
复制
$i = 0;
echo $i++;
echo $i;
$j=0;
echo ++$j;
echo $j;

前增量显示递增后的值。但是Post递增显示值然后递增。关于代码将输出01和11

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6400518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档