解释数组和索引和值的 ++ 运算符
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
我没有足够的时间自己做。
祝你好运!
我明白了,这都是关于运算符优先级的。
正在按以下顺序处理运算符:
- [
- ++(从左到右)
- =
在这些步骤中正在解释以下代码:
$i = 1;
$a[$i] = $i++;
- $i++ returns 1 然后递增
- $a[$i] 正在分配 $i === 2
- $a[2] 被分配了第 1 步的 return 值。所以 $a[2] === 1
并使用此代码:
$j = 1;
$b[$j++] = $j++;
- 左边的$j++ returns 1和$j正在递增
- 右边的$j++ returns 2(因为在第1步已经递增)$j正在再次递增。此时$j === 3
- $b[1] 被分配,因为第一步 returns 1.
- $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 是运行时预编译的,因此在编译时间 和 执行时间方面也优化了性能。 行为未定义,并且可能因版本而异。
你永远不应该在一条指令中依赖这样的结构——在任何语言中,除非它在它的规范中有明确的定义。
我正在研究 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
我没有足够的时间自己做。
祝你好运!
我明白了,这都是关于运算符优先级的。
正在按以下顺序处理运算符:
- [
- ++(从左到右)
- =
在这些步骤中正在解释以下代码:
$i = 1;
$a[$i] = $i++;
- $i++ returns 1 然后递增
- $a[$i] 正在分配 $i === 2
- $a[2] 被分配了第 1 步的 return 值。所以 $a[2] === 1
并使用此代码:
$j = 1;
$b[$j++] = $j++;
- 左边的$j++ returns 1和$j正在递增
- 右边的$j++ returns 2(因为在第1步已经递增)$j正在再次递增。此时$j === 3
- $b[1] 被分配,因为第一步 returns 1.
- $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 是运行时预编译的,因此在编译时间 和 执行时间方面也优化了性能。 行为未定义,并且可能因版本而异。
你永远不应该在一条指令中依赖这样的结构——在任何语言中,除非它在它的规范中有明确的定义。