最近我遇到了这样的代码片段:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;
这段代码的输出是1:3
。根据运算符优先级表,我发现逻辑运算符||
和&&
的优先级高于赋值运算符=
。所以第一个表达式应该被解析为$x = (2 && $y) = 3;
,它变成了$x = (2 && null) = 3;
,最终评估为$x = false = 3;
。其次,赋值运算符具有右关联性,因此解释器应尝试执行false = 3
,这当然是非法的。所以在我看来,上述代码片段根本不应该编译,并且必须抛出解析或运行时错误。但是,脚本产生了1:3的结果。这意味着解释器执行的操作是:
a) $y=3
b) 2 && $y
c) $x = (2 && $y)
为什么会这样而不是按照运算符优先级?
(2 && $y) = 3
这样的分组是没有意义的。 - deceze