我不明白这段代码中的预增量部分

时间:2017-10-12 11:57:10

标签: php

有人可以告诉我为什么这段代码的输出是22而不是21?

arr

4 个答案:

答案 0 :(得分:4)

x被存储的递增值x增加。

x += (x = x + 1).

答案 1 :(得分:4)

$x += ++$x;

首先评估此作业的右侧:

  1. 增量$x$x现在为11,结果++$x11
  2. $x11)的值并将步骤1的结果添加到其中22
  3. 将步骤2的结果分配给$x

答案 2 :(得分:1)

在内部,评估为:

# op          ext  return  operands
-------------------------------------
1 ASSIGN                   !0, 10
2 PRE_INC          $2      !0
3 ASSIGN_ADD    0          !0, $2
4 ECHO                     !0
  1. 10 分配给$x(以上称为!0
  2. 预增量$x,即
    • 1 添加到$x
    • 返回新结果( 11
  3. 通过第2步的返回值(同样 11 )增加$x(现在 11
  4. 回应结果( 22
  5. (编辑VLD输出以提高可读性,请参阅此处的完整版:https://3v4l.org/mftI4/vld#output

答案 3 :(得分:0)

这完全取决于操作顺序。

$ a + = $ b只是$ a = $ a + $ b的简写。现在,用这种知识“展开”你的第二行:

$x = $x + (++$x);

要为$ x赋值,我们必须首先评估作业的右侧。为此,我们首先需要执行++操作,然后才能添加右侧的变量。

那么这个上下文中的operator ++是什么?它又是一个函数的简写,它做了类似的事情:

function preIncrement(&$variable) {
    $variable = $variable + 1;
    return $variable;
}

请注意,变量是一个引用(& $ variable,而不是$ variable)。这意味着在该函数内部,如果我们修改变量,它将修改传递给它的变量OUTSIDE。因此,当我们传递$ x时,函数会增加$ x,然后返回一些数值。该数字值正在分配的右侧被替换。 所以,当这条线看起来真的是:

$x = $x + postIncrement($x);

因此,要评估我们需要首先在赋值中执行函数并获取函数返回值。它恰好是11.很好,现在我们知道我们需要将11加到$ x。

$x = $x + 11;

很好,我们只需读取$ x的当前值即可分配。 $ x是11. postIncrement函数在执行时将其增加到11。所以:

$x = 11 + 11;

现在,$ x是22。

让我们将其与后期增量进行比较:

$x+=$x++;

展开+ = ...

$x = $x + $x++;

和以前一样,在我们评估之前,我们需要获得$ x ++的返回值。后增量看起来像这样:

function postIncrement(&$variable) {
    $oldValue = $variable;
    $variable = $variable + 1;
    return $oldValue;
}

所以需要我们的$ x,增加它的值,但返回原始值。结果,$ x ++被评估为10.现在我们到达:

$x = $x + 10;

好的,我们来评估$ x。 $ x是11.当我们执行它时,后增量增加了它。所以:

$x = 11 + 10;

因此,在这种情况下,$ x为21。

希望这会对你有所帮助。