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

问题描述 投票:0回答:3

当我执行这段代码时,我正在学习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上得不到相同的结果。

php php-7 php-7.2 post-increment
3个回答
2
投票

在没有测试/搜索的情况下,不像其他人甚至不知道他们在谈论什么那样回复,而是在调试转换为byteCode时分析PHP的方式的开始。

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

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

祝好运 !


1
投票

即使C ++是编译时语言,在qazxsw poi等指令上也没有标准行为,编译器之间的结果也不同。

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

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


1
投票

我想通了,它完全是关于运算符优先级的。

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

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

以下代码将在以下步骤中解释:

x = x++
  1. $ i ++返回1然后递增
  2. $ a [$ i]正在分配$ i === 2
  3. $ a [2]被赋值为步骤1的返回值。所以$ a [2] === 1

并使用此代码:

$i = 1;
$a[$i] = $i++;
  1. 左$ j ++返回1,$ j正在递增
  2. 正确的$ j ++返回2(因为它已在步骤1中递增)并且$ j再次递增。此时,$ j === 3
  3. 分配$ b [1]因为第一步返回1。
  4. $ b [1]被赋予了步骤2的返回值。所以$ b [1] === 2

所以最后一个例子几乎与此相同:

$j = 1;
$b[$j++] = $j++;
© www.soinside.com 2019 - 2024. All rights reserved.