运算符优先级与短路求值:为何$x = false && print 'printed' || true;结果为false?
分步解析表达式
$x = false && print 'printed' || true; 的求值过程 先明确PHP里的核心规则:
- 运算符优先级:
&&>||> 赋值运算符= - 逻辑运算符
&&和||都是短路求值:只要左边结果能确定整个表达式的最终值,右边代码就不会执行 print是语言构造,优先级低于&&和||,会被逻辑运算符的表达式包裹
正确求值步骤(结果应为true)
优先计算
&&子表达式:false && print 'printed'- 因为
&&短路求值,左边的false已经能确定整个&&表达式的结果是false,所以右边的print 'printed'不会执行(无任何输出) - 这一步的结果为
false
- 因为
计算
||子表达式:false || true||短路求值,左边的false无法确定最终结果,因此计算右边的true- 这一步的结果为
true
赋值给
$x:$x = true- 最终
$x的值为true
- 最终
若你得到$x = false的常见原因
如果实际运行结果是$x = false,大概率是表达式写法或优先级理解出现偏差,常见两种情况:
- 错误给
print和||加了括号:比如写成$x = false && (print 'printed' || true)- 先算括号内的
print 'printed' || true:print执行(输出printed),返回值为1(print始终返回1),1 || true结果为true - 再算
false && true:短路求值,结果为false,最终$x = false
- 先算括号内的
- 混淆
&&和and运算符:and优先级低于赋值运算符=,如果写成$x = false and print 'printed' || true- 会被解析为
($x = false) and (print 'printed' || true),$x直接被赋值为false,后续逻辑运算不影响$x的值
- 会被解析为
内容的提问来源于stack exchange,提问作者Mohammed Ayesh
相关产品推荐
相关产品推荐

