执行此代码时,我正在研究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上没有得到相同的结果。
答案 0 :(得分:2)
这里不再像其他人一样不经过测试/搜索就不知道他们在说什么,而是从这里开始调试了将PHP转换为byteCode时所分析的方式。
https://derickrethans.nl/projects.html#vld
我没有足够的时间自己做。
祝你好运!
答案 1 :(得分:1)
我想通了,这全都与运算符的优先级有关。
正在按以下顺序处理运算符:
以下步骤中正在解释以下代码:
$i = 1;
$a[$i] = $i++;
并使用以下代码:
$j = 1;
$b[$j++] = $j++;
因此,最后一个示例几乎执行以下操作:
function incrementInteger(int &$i): int
{
++$i;
return $i - 1;
}
$j = 1;
$b[incrementInteger($j)] = incrementInteger($j);
答案 2 :(得分:1)
即使C ++是一种编译时语言,在x = x++
之类的指令上也没有标准行为,并且编译器之间的结果也不同。
PHP已在运行时进行了预编译,因此在编译时间和执行时间方面对性能进行了优化。 行为未定义,并且可能因版本而异。
您永远都不应在一条指令中依赖这样的构造-除非语言规范中对其进行了明确定义,否则没有任何语言。