【问题标题】:PHP calculation - why is 1+1=3? [duplicate]PHP计算——为什么1+1=3? [复制]
【发布时间】:2014-07-25 06:53:58
【问题描述】:

我朋友发给我的代码是:

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

为什么是 3?

【问题讨论】:

标签: php


【解决方案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

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

documentation 中提到了这种行为:

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

?: operator 上的维基百科文章也提到了这一点:

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

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

【讨论】:

  • 我会将“大多数语言”改写为“所有其他具有三元条件的语言”。
  • @hacks:是的,这很奇怪。但是PHP。 :P
  • PHP's behaviour [...] is non-obvious。我总是对手册中的那一行感到兴奋。 “完全错误”的委婉说法。
  • @mpm 添加了 2012 年错误报告的链接以确保完整性。
  • @mpm 如果我对 PHP 的每个应该改变但永远不会改变的部分都有一毛钱,我就不必再使用它了。
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2021-11-24
  • 2018-08-21
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多