【发布时间】:2018-09-28 10:12:56
【问题描述】:
最近我遇到了这样的sn-p:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;
产生输出1:3。
通过查看运算符precedence sheet,我发现逻辑运算符|| 和&& 的优先级高于赋值运算符=。所以第一个表达式应该被评估为$x = (2 && $y) = 3;,它变成$x = (2 && null) = 3;,最后评估为$x = false = 3;其次-赋值运算符具有正确的关联性,所以解释器应该尝试执行false = 3,这当然是非法的。所以在我看来,上面提到的代码 sn-p 根本不应该编译,必须抛出解析或运行时错误。但不是该脚本产生 1:3。这意味着解释器执行的操作是:
a) $y=3
b) 2 && $y
c) $x = (2 && $y)
为什么是这样而不是根据运算符优先级?
【问题讨论】:
-
你不能赋值给一个表达式,所以分组
(2 && $y) = 3没有意义。 -
所以如果某些表达式没有意义 - 我们应该改变运算符优先级以便能够从表达式中提取一些意义?如果动态更改的优先规则与开发人员的意图相反怎么办?我只能同意,如果某些表达式根本没有意义 - 不要运行它或使其崩溃。
-
¯\_(ツ)_/¯ 那是你的 PHP...