PHP计算 - 为什么1 + 1 = 3?

Ism*_*ail 44 php

我朋友寄给我的代码是:

echo '1+1='.(1+1==2?2:1+2==2?3:2);
Run Code Online (Sandbox Code Playgroud)

为什么是3?

p.s*_*w.g 84

PHP对三元(或条件)运算符的评估与其他语言略有不同.

1+1==2 ? 2 : 1+2==2 ? 3 : 2
Run Code Online (Sandbox Code Playgroud)

大多数语言(例如JavaScript)会将其评估为:

(1+1==2) ? (2) : ( (1+2==2) ? (3) : (2) ) 
=> 2
Run Code Online (Sandbox Code Playgroud)

但是,PHP将其评估为:

( (1+1==2) ? (2) : (1+2==2) ) ? (3) : (2)
=> 3
Run Code Online (Sandbox Code Playgroud)

因此,因为(1+1==2)计算结果为true,所以第一个三元表达式的结果将计算2结果,然后将结果传递给第二个三元表达式,该表达式的计算结果为3.

文档中提到了此行为:

建议您避免"堆叠"三元表达式.PHP在单个语句中使用多个三元运算符时的行为是不明显的......

关于?:运营商的维基百科文章也提到了这一点:

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

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

  • 我将"大多数语言"改为"所有其他具有三元条件的语言". (48认同)
  • `PHP的行为[...]是不明显的.我总是在手册中找到那条线.这种可爱的委婉说法是"完全错误的". (48认同)
  • @mpm如果我对PHP的每个部分都有一分钱应该改变但永远不会,我就不必再次使用它了. (12认同)
  • @haccks:是的,这很奇怪.但PHP.:P (2认同)