我朋友寄给我的代码是:
echo '1+1='.(1+1==2?2:1+2==2?3:2);
为什么是3?
答案 0 :(得分:84)
PHP对三元(或条件)运算符的评估与其他语言略有不同。
1+1==2 ? 2 : 1+2==2 ? 3 : 2
大多数语言(例如JavaScript)会将其评估为:
(1+1==2) ? (2) : ( (1+2==2) ? (3) : (2) )
=> 2
但是,PHP将其评估为:
( (1+1==2) ? (2) : (1+2==2) ) ? (3) : (2)
=> 3
因为(1+1==2)
的计算结果为true,所以第一个三元表达式的结果计算结果为2
,然后将该结果传递给第二个三元表达式,该表达式的计算结果为3
。
documentation中提到了这种行为:
建议您避免“堆叠”三元表达式。 PHP在单个语句中使用多个三元运算符时的行为是不明显的......
?:
operator上的维基百科文章也提到了这一点:
由于语言语法中的一个不幸的错误,与其他语言相比,PHP中的?:的实现使用了错误的关联性......
原因是嵌套两个条件运算符会产生一个超大条件,最后两个选项作为其分支:
c1 ? o1 : c2 ? o2 : o3
实际上是((c1 ? o1 : c2) ? o2 : o3)
。这是公认的,可能不会改变。