Agn*_*kas 5 php operator-precedence
最近我遇到了这样的片段:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;
Run Code Online (Sandbox Code Playgroud)
产生输出1:3。通过查看运算符优先级表,我看到逻辑运算符||并且&&比赋值运算符具有更高的优先级=。所以第一个表达式应该被评估为$x = (2 && $y) = 3;which become$x = (2 && null) = 3;并最终评估为$x = false = 3;Second - 赋值运算符具有右结合性,所以解释器应该尝试执行false = 3这当然是非法的。所以在我看来,上面提到的代码片段根本不应该编译,并且必须抛出解析或运行时错误。但不是那个脚本产生 1:3。这意味着解释器执行的操作是:
a) $y=3
b) 2 && $y
c) $x = (2 && $y)
为什么是这样而不是根据运算符优先级?
您链接到的运算符优先级表作为单独的注释说明:
虽然 = 的优先级低于大多数其他运算符,但 PHP 仍然允许类似于以下的表达式:if (!$a = foo()),在这种情况下,foo() 的返回值将放入 $a 中。
因此,实际上,表达式内的赋值将被视为有点像子表达式。文档中并不清楚这种情况如何以及何时发生,仅指出“相似”表达式将以这种方式工作。
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |