【问题标题】:Explaining arrays and ++ operator on index and value在索引和值上解释数组和 ++ 运算符
【发布时间】:2019-08-16 20:21:07
【问题描述】:

执行此代码时,我正在研究 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 7.x ?即使在 PHP 4.x 上,这也是有道理的。
  • 我知道前增量和后增量之间的区别。我没有得到的是数组分配完成的顺序以及为什么在这两个示例中键和值是相反的。
  • @MossetJérémie 它仍然是完全无意义的,试图在访问索引时增加索引值......操作顺序应该完全相同,至少在理论上(我不是安装 PHP 4.x 只是为了重现不合逻辑的代码)。

标签: php php-7 php-7.2 post-increment


【解决方案1】:

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

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

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

祝你好运!

【讨论】:

    【解决方案2】:

    即使 C++ 是一种编译时语言,也没有像 x = x++ 这样的指令的标准行为,编译器之间的结果也不同。

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

    您不应该在一条指令中依赖因此构造 - 任何语言,除非它在其规范中明确定义。

    【讨论】:

      【解决方案3】:

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

      运算符按此顺序处理:

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

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

      $i = 1;
      $a[$i] = $i++;
      
      1. $i++ 返回 1,然后递增
      2. $a[$i] 被分配 $i === 2
      3. $a[2] 被分配了第 1 步的返回值。所以 $a[2] === 1

      还有这段代码:

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

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

      function incrementInteger(int &$i): int
      {
          ++$i;
          return $i - 1;
      }
      
      $j = 1;
      $b[incrementInteger($j)] = incrementInteger($j);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-23
        • 2011-10-15
        • 1970-01-01
        • 2022-01-06
        • 2018-12-21
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        相关资源
        最近更新 更多