解释数组和索引和值的 ++ 运算符

Explaining arrays and ++ operator on index and value

我正在研究 php7.2 中的运算符优先级,当我执行这段代码时:

$i = 1;
$a[$i] = $i++;

var_dump($a);

$j = 1;
$b[$j++] = $j++;

var_dump($b);

我得到了这个结果:

array(1) {
  [2]=>
  int(1)
}
array(1) {
  [1]=>
  int(2)
}

我不明白为什么这段代码会给出这些输出。我可以得到第一个 var_dump 但第二个对我来说真的很奇怪。

您能否解释一下 php 如何逐步解释这两个示例?

虽然我在 php 4 上没有得到相同的结果。

与其像其他人一样没有testing/searching甚至不知道自己在说什么就回复,这里是调试PHP转换为字节码时的分析方式的开始。

https://derickrethans.nl/projects.html#vld

我没有足够的时间自己做。

祝你好运!

我明白了,这都是关于运算符优先级的。

正在按以下顺序处理运算符:

  1. [
  2. ++(从左到右)
  3. =

在这些步骤中正在解释以下代码:

$i = 1;
$a[$i] = $i++;
  1. $i++ returns 1 然后递增
  2. $a[$i] 正在分配 $i === 2
  3. $a[2] 被分配了第 1 步的 return 值。所以 $a[2] === 1

并使用此代码:

$j = 1;
$b[$j++] = $j++;
  1. 左边的$j++ returns 1和$j正在递增
  2. 右边的$j++ returns 2(因为在第1步已经递增)$j正在再次递增。此时$j === 3
  3. $b[1] 被分配,因为第一步 returns 1.
  4. $b[1] 被分配了第 2 步的 return 值。所以 $b[1] === 2

所以最后一个例子和这个几乎是一样的:

function incrementInteger(int &$i): int
{
    ++$i;
    return $i - 1;
}

$j = 1;
$b[incrementInteger($j)] = incrementInteger($j);

即使 C++ 是一种编译时语言,也没有像 x = x++ 这样的指令的标准行为,并且结果因编译器而异。

PHP 是运行时预编译的,因此在编译时间 执行时间方面也优化了性能。 行为未定义,并且可能因版本而异。

你永远不应该在一条指令中依赖这样的结构——在任何语言中,除非它在它的规范中有明确的定义。