我读了PHP.net docs,其中说明了:
运算符**的优先级高于++。
但是当我运行这段代码时,我得到了意想不到的输出:
<?php
$a = 2;
echo(++ $a ** 2);
// output: 9, means: (++$a) ** 2
// expected: 5, means: ++($a ** 2)
你能帮助我明白为什么会这样吗?谢谢!
答案 0 :(得分:4)
这是因为++$a
是预增量,$a++
是后增量。
您可以阅读有关此here
的更多信息另外,
运算符优先级和关联性仅确定表达式的方式 如果进行分组,则不会指定评估顺序。 PHP没有 (在一般情况下)指定表达式的顺序 评估和代码应该采用特定的评估顺序 要避免,因为行为可以在PHP或版本之间发生变化 取决于周围的代码。
答案 1 :(得分:1)
我很确定,这里的文档是错误的。
运算符**的优先级高于++。
这句话似乎与分组服从运营商优先权的方式相矛盾。
运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。
事实上,如果我们在**
之前对++
进行分组,我们会获得++($a ** 2)
,就像问题中所述。但是这个表达式甚至不是有效的,因为++
运算符只能用于变量,而不能用于表达式。
++
仅对变量有效的事实意味着没有具有两个操作数的运算符可以具有更高的优先级。
答案 2 :(得分:0)
似乎发生的事情是在操作之外评估Post / Pre增量。因此执行**
并返回结果。
$a
变量在操作后更新。 $a
变量在操作之前更新。所以文档
运算符**的优先级高于++。
对我来说似乎有点奇怪。
经过一番搜索后,评论中也提到了这一点: http://php.net/manual/en/language.operators.increment.php#119098
Ow和文档本身。
<?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);
答案 3 :(得分:-1)
Spaces,这就是原因!
++ $a ** 2
与++$a ** 2
不同,也与++$a**2