PHP求幂运算符优先级

PHP求幂运算符优先级,php,operators,operator-precedence,Php,Operators,Operator Precedence,我读了一份报告,其中指出: 运算符**的优先级高于++ 但当我运行此代码时,会得到意外的输出: <?php $a = 2; echo(++ $a ** 2); // output: 9, means: (++$a) ** 2 // expected: 5, means: ++($a ** 2) 这是因为++$a是预增量,$a++是后增量 你可以阅读更多关于这方面的内容 而且 运算符优先级和关联性仅决定表达式的方式 如果已分组,则它们不会指定求值顺序。PHP没有 (在一般情况下)指定表达

我读了一份报告,其中指出:

运算符**的优先级高于++

但当我运行此代码时,会得到意外的输出:

<?php
$a = 2;
echo(++ $a ** 2); 
// output: 9, means: (++$a) ** 2
// expected: 5, means: ++($a ** 2)

这是因为
++$a
是预增量,
$a++
是后增量

你可以阅读更多关于这方面的内容

而且

运算符优先级和关联性仅决定表达式的方式 如果已分组,则它们不会指定求值顺序。PHP没有 (在一般情况下)指定表达式的使用顺序 已评估,并且假定特定评估顺序的代码应 必须避免,因为这种行为可能会在不同版本的PHP或 取决于周围的代码

发件人:

空间,这就是为什么


+$a**2
不同于
+$a**2
,这也不同于
+$a**2

似乎发生的是,在操作之外对后期/前期增量进行评估。因此执行
**
,并返回结果

  • 对于后期增量,
    $a
    变量在操作后更新
  • 对于预增量,
    $a
    变量在操作前更新
因此,文件

运算符**的优先级高于++

我觉得有点奇怪

经过一些搜索后,评论中也提到了这一点:

在文档本身中

<?php
// POST
$a = 2;
echo($a ** 2);      // 4
echo(PHP_EOL);
echo($a++ ** 2);    // 9
echo(PHP_EOL);
echo($a);           // 3
echo(PHP_EOL);
echo(PHP_EOL);

// PRE
$a = 2;
echo($a ** 2);      // 4
echo(PHP_EOL);
echo(++$a ** 2);    // 4
echo(PHP_EOL);
echo($a);           // 3
echo(PHP_EOL);
echo(PHP_EOL);

我很肯定,这里的文档是错误的

运算符**的优先级高于++

该语句似乎与分组如何遵循运算符优先级相矛盾

运算符优先级和关联性仅决定表达式的分组方式,而不指定计算顺序

事实上,如果我们将
**
分组在
++
之前,我们会得到
++($a**2)
,就像问题中所说的那样。但是这个表达式甚至无效,因为
++
运算符只能用于变量,不能用于表达式


++
仅对变量有效这一事实意味着具有两个操作数的运算符不能具有更高的优先级

可能尝试将加号定位在
$a
-
($a++**2)
之后<代码>++$i
是增量前的,而
$i++
是增量后的。是的,您的代码按预期工作(先指数,然后增量)。我想知道为什么我的代码没有(至少与文档所说的相比)。运算符优先级和关联性只决定表达式的分组方式,它们没有指定求值顺序。这很有意义。我找到了关于这个问题的帖子:
echo($a++**2)给我
4
,然后
echo($a)
给我3。因此PHP在内部计算
($a**2)
,并返回结果。在稍后阶段,它更新
$a
echo($a++**2)的值
给我的值与echo($a**2)的值相同
(PHP7.1)这可能是无效的..非常有趣的
echo($a++**2)给我
4
但是
echo($a)
给我
3
。因此php首先执行
($a**2)
并返回结果。在这之后,它在内部设置了
$a
的有效值。代码没有将
$a++
设置为等于任何值,换句话说,
$a
实际上没有改变,因为没有存储回它的原始值-除非我误解了你的评论。不,这不是原因。这与我的答案基本上不一样吗?除了我的解释,优先级实际上并没有设置求值的顺序否,因为
echo($a++**2)
我们将排除答案
5
而不是
4
,所以我取出我提供的代码,我们得到了相同的答案,而你的答案没有解释优先级!=评估,因此你的答案实际上并没有回答提问,在你答案中stackoverflow答案的链接中,你可以看到表格:)这是最重要的部分。哈哈,我被
4
弄糊涂了,但是仍然存在一个问题,
**
操作符什么时候优先于OP链接的页面上记录的
++