PHP逻辑与赋值运算符优先级疑问:$x=2&&$y=3为何输出1:3?
为什么PHP代码
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;输出是1:3? 咱们先把代码摆出来方便对照:
$x = 2 && $y = 3; echo (int)$x.':'.(int)$y; // 实际输出:1:3
你一开始的思路有点跑偏了,咱们一步步拆解实际的执行逻辑:
首先,你说的&&优先级高于=是对的,但关键是赋值运算符是右结合的,而且PHP里赋值表达式本身会返回被赋的值——这两点结合起来才是核心。
实际的表达式解析是这样的:$x = (2 && ($y = 3))
而不是你想的$x = (2 && $y) = 3——后者完全不成立,因为赋值运算符左边必须是可写变量(左值),2 && $y是个表达式,根本没法被赋值,PHP解释器不会这么处理。
具体执行步骤:
- 先处理最右边的
$y = 3:把3赋值给$y,同时这个赋值表达式的返回值是3(PHP里所有赋值操作都会返回被赋予的值)。 - 接着计算
2 && 3:在PHP里,非零整数都会被判定为true,所以true && true的结果是true。 - 最后把
true赋值给$x,当用(int)强制转换时,true会被转换成整数1。 - 所以最后输出就是
1:3。
顺便验证下:如果你硬写$x = (2 && $y) = 3;,PHP会直接抛出语法错误Parse error: syntax error, unexpected '=',这也说明你的初始解析逻辑不成立。
内容的提问来源于stack exchange,提问作者Agnius Vasiliauskas
相关产品推荐
相关产品推荐

