PHP自增特性

3

有人能解释一下为什么会出现这种情况吗:

$a[0] = 1;
$a[0] = $a[0]++;
echo $a[0];

在这段代码中,a[0] 总是变成 1。即使多次执行 $a[0] = $a[0]++;,它也不会增加 a[0] 的值。

但如果我们像这样分配给另一个变量:

$a[0] = 1;
$b[0] = $a[0]++;
echo $a[0];

$a[0]将被设置为2。(当然,b [0]将是1)。

我不明白为什么会这样。


谢谢大家,现在我明白它是如何工作的了。 - NZT
1
欢迎,开始吧... - Murad Hasan
4个回答

3

来自 PHP 文档:

PHP supports C-style pre- and post-increment and decrement operators.

++$a  Pre-increment   Increments $a by one, then returns $a.
$a++  Post-increment  Returns $a, then increments $a by one.
当使用后增量 ($x++) 时,如果将结果分配给另一个变量,则最终将得到递增发生之前的变量值。详见 http://php.net/manual/zh/language.operators.increment.php

3
简化这个内容以删除索引。它是不需要的。
$a = $a++;

首先,右侧代码会先运行。因为++在变量后面,它意味着“先返回$a, 然后再将$a增加1”,代码会按照这个顺序执行。它会先将$a返回给赋值操作,然后再将$a增加。
当右侧代码执行完成后,就会运行赋值操作。右侧代码在递增$a之前已经将$a返回,所以此时它仍然是$a的原始值。这个原始值就被赋给了$a,覆盖了刚刚发生在右侧的递增操作。

"$a = $a++;" 是多余的,与 "$a[0]++" 完全不同,你只需要 "$a++" 没有必要进行赋值。 - I wrestled a bear once.

2
因为你的++在变量后面,这意味着它会在++运算符返回原始值并且赋值运算符将其重新分配回原始值后递增。由于你在递增之前重新分配了变量,因此数字永远没有机会递增。 正确的方法是只需删除重新分配即可。
$a[0] = 1;
$a[0]++;
echo $a[0];

您也可以将++移动到开头,这样它就会按预期运行:

https://3v4l.org/Tijrb

$a[0] = 1;
$a[0] = ++$a[0];
echo $a[0];

https://3v4l.org/9fZ3U


它在将 $a[0]$ 返回给赋值运算符后递增,而不是在 echo 后递增。echo 在下一行代码中。在那行代码之前递增就已经发生了。 - kainaw
递增操作永远不会发生,因为变量在递增后立即被重新赋值。 - I wrestled a bear once.
那么,这一定是个打字错误。我在屏幕上看到的你的陈述是“它将在回显之后递增。” 它将在回显之前递增,在赋值之前被覆盖。 - kainaw
“Increment never takes place” 也是不正确的。增量在赋值之前发生,而赋值会覆盖增量。因此,增量确实发生了。只是在下一步操作中被覆盖了。 - kainaw
我已经澄清了答案。是的,那是一个打字错误,我没有意识到我说的是echo,但是,是的,在重新分配之后而不是之前,要增加变量,您需要在变量之前放置++,就像我解释的那样。 - I wrestled a bear once.

2
好的,让我们从第一个开始。你将$a[0]的值赋为1,然后对其进行递增操作,但再次存储在$a[0]中,因为递增是后置递增,所以$a[0]尚未更新。但如果你使用前置递增,则会得到值2。 例子1:
$a[0] = 1;
$a[0] = $a[0]++;
echo $a[0]; //1

查看前缀递增的效果:

$a[0] = 1;
$a[0] = ++$a[0];
echo $a[0]; //2

例子2:

和例子一样,你使用了后置自增运算符,但这次你将结果存储在不同的变量中,这意味着$a[0]没有被更新,只有自增操作被执行。所以你得到了结果2。这里的后置自增和前置自增是相同的。

$a[0] = 1;
$b[0] = $a[0]++;
echo $a[0]; //2

在这个阶段,$b[0]的值将与$a[0]的值相同。但是如果在此处应用前增量,则$b[0]的值也会更改,并且存储为2。

注意:您需要理解前增量后增量。了解更多信息,请访问language.operators.increment.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接