【问题标题】:Why is ternary operator ignoring condition order?为什么三元运算符忽略条件顺序?
【发布时间】:2015-12-23 06:09:51
【问题描述】:

我正在研究三元运算嵌套,并用这个例程做了一些测试:

<?php

$test1 = [15,30,'ok'];
$test2 = [8,90,'fail'];
$test3 = [4,32,'ok'];

$test1[2] == 'ok' ?
    print('First passed. The second round marks '.
            $test2[1]/$test2[0] < 10 ? 'an irrelevant value' : $test2[1]/$test2[0].
            ' and the third was skipped.') :
    print('First failed. The second round was skipped and the third marks '.
            $test3[1]/$test3[0] < 10 ? 'an irrelevant value' : $test3[1]/$test3[0]);

虽然我知道为什么它没有以我期望的方式打印字符串(在条件测试之前它会忽略所有内容),因为它在三元运算符周围没有括号,尽管如此,它还是表现出一些奇怪的行为。它正在颠倒操作员的评估优先级。

示例

按原样编写的这个测试应该返回11.25,因为11.25 &gt; 10,但它却返回an irrelevant value

如果我将&lt; 运算符更改为&gt;,它应该打印an irrelevant value,因为它是true,但它的计算结果为false 并打印11.25

谁能向我解释为什么会这样?就像我说过的,我知道上面的语句在语法上是错误的,但我愿意理解它为什么会改变 PHP 的逻辑工作方式。

【问题讨论】:

  • 括号。除法和比较的operator precedence高于?:
  • 我认为上面的cmets应该放在一个答案中。你们不属于试试这个精​​英俱乐部 ;-) 编辑:马克删除了他的评论。
  • 不知道为什么这个问题被否决了,我觉得它很有趣。
  • 正是为什么你不应该嵌套三元运算。
  • @JayBlanchard 外部三元组不是问题的一部分。您可以简单地删除它们。问题是. vs &lt; vs ?: - 不涉及嵌套。此外,在这种情况下,三元组甚至没有直接嵌套:X ? print(Y) : print(Z) - YZ 恰好包含三元组,但不会因为括号而造成混淆。

标签: php ternary-operator


【解决方案1】:

http://php.net/manual/en/language.operators.precedence.php 列出 PHP 运算符及其优先级。根据这张表,

'First passed. The second round marks ' . $test2[1] / $test2[0] < 10
    ? 'an irrelevant value'
    : $test2[1] / $test2[0] . ' and the third was skipped.'

解析为

(('First passed. The second round marks ' . ($test2[1] / $test2[0])) < 10)
    ? 'an irrelevant value'
    : (($test2[1] / $test2[0]) . ' and the third was skipped.')
  • / 绑定比 . 更紧密
  • . 绑定比 &lt; 更紧密
  • &lt; 绑定比 ?: 更紧密

换句话说,您将字符串'First passed. The second round marks 11.25' 与数字10 进行比较。

【讨论】:

  • 优先权总是让我措手不及。非常感谢!
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多