有人可以告诉我为什么这段代码的输出是22而不是21?
arr
答案 0 :(得分:4)
x被存储的递增值x增加。
x += (x = x + 1).
答案 1 :(得分:4)
$x += ++$x;
首先评估此作业的右侧:
$x
→$x
现在为11
,结果++$x
为11
$x
(11
)的值并将步骤1的结果添加到其中22
$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
$x
(以上称为!0 )$x
,即
$x
$x
(现在 11 )(编辑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。
希望这会对你有所帮助。