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

php
2022-08-30 11:30:32

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

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

为什么是3?


答案 1

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

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

文档中提到了此行为:

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

维基百科上关于?:运算符的文章也提到了这一点:

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

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


答案 2

推荐