PHP计算 – 为什么是1 + 1 = 3?

我的朋友发给我的代码是:

echo '1+1='.(1+1==2?2:1+2==2?3:2); 

为什么是3?

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,所以第一个三元expression式的结果为2 ,然后将结果传递给第二个三元expression式,计算结果为3

这个行为在文档中被提到:

build议您避免“叠加”三元expression式。 在单个语句中使用多个三元运算符时,PHP的行为是不明显的…

维基百科关于?:运算符的文章也提到:

由于语言语法中的一个不幸的错误,在PHP中实现?:与其他语言相比使用不正确的关联性。

原因在于嵌套两个有条件的运算符产生一个超大的条件,最后两个选项作为它的分支: c1 ? o1 : c2 ? o2 : o3 c1 ? o1 : c2 ? o2 : o3 c1 ? o1 : c2 ? o2 : o3真的是((c1 ? o1 : c2) ? o2 : o3) 。 这是公认的,可能不会改变。

  • 参见: 错误#61915