【问题标题】:Why do long and short forms of the ternary operator evaluate differently?为什么三元运算符的长形式和短形式的评估不同?
【发布时间】:2015-08-27 11:29:52
【问题描述】:

corresponding nested ternary operator in php?In which order are nested short hand assignments evaluated? 解释说 PHP 中的三元运算符不会按预期进行计算。

看这个例子:

echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2

即使阅读文档,我仍然无法理解为什么短格式和长格式的评估方式不同?

【问题讨论】:

  • 你有什么不明白的?您已经对正确的欺骗有一个问题,这解释了三元是左关联的
  • @Rizier123 但是如果两个示例都是左关联的,为什么它们会输出不同的值?是在内部使用速记组还是有不同的优先顺序?
  • @billyonecan 因为它们是不同的三元运算符,所以你的 2 行是不同的
  • @billyonecan 写信并回答:stackoverflow.com/a/32248940/3933332 希望逐步格式化有助于显示正在发生的事情
  • @Rizier123 这不是我的问题,我只是好奇 :)

标签: php ternary-operator


【解决方案1】:

您已经开始错误地假设这 2 行代码是相同的,因为它们不是。三元 (expression ? IF TRUE : IF FALSE) 运算符是左关联的。

所以,如果你一步一步来,你可能会看得更清楚:

第一个三元行:

echo 0 ?: 1 ?: 2 ?: 3; //1

带括号:

回声 ((0 ?: 1) ?: 2) ?: 3; //1
      └──────┘ //0 → FALSE
       ↓ //第二个表达式:1
回声 ((1) ?: 2) ?: 3; //1
     └────────┘ //1 → TRUE
      ↓ //第一个表达式:1
回声 (1) ?: 3; //1
     └──────┘ //1 → TRUE
     ↓ //第一个表达式:1
回声 1; //1

二三线:

echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2

带括号:

回声 ((0 ? 0 : 1) ? 1 : 2) ? 2:3; //2
      └──────────┘ //0 → FALSE
       ↓ //第二个表达式:1
回声 ((1) ? 1 : 2) ? 2:3; //2
     └────────────┘ //1 → TRUE
      ↓ //第一个表达式:1
回声 (1) ? 2 : 3; //2
     └──────────┘ //1 → TRUE
     ↓ //第一个表达式:2
回声 2; //2

【讨论】:

  • 啊哈,终于让我明白了“左联想”的真正含义。非常感谢,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2018-03-29
相关资源
最近更新 更多