【发布时间】: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 > 10,但它却返回an irrelevant value!
如果我将< 运算符更改为>,它应该打印an irrelevant value,因为它是true,但它的计算结果为false 并打印11.25。
谁能向我解释为什么会这样?就像我说过的,我知道上面的语句在语法上是错误的,但我愿意理解它为什么会改变 PHP 的逻辑工作方式。
【问题讨论】:
-
括号。除法和比较的operator precedence高于
?: -
我认为上面的cmets应该放在一个答案中。你们不属于试试这个精英俱乐部 ;-) 编辑:马克删除了他的评论。
-
不知道为什么这个问题被否决了,我觉得它很有趣。
-
这正是为什么你不应该嵌套三元运算。
-
@JayBlanchard 外部三元组不是问题的一部分。您可以简单地删除它们。问题是
.vs<vs?:- 不涉及嵌套。此外,在这种情况下,三元组甚至没有直接嵌套:X ? print(Y) : print(Z)-Y和Z恰好包含三元组,但不会因为括号而造成混淆。
标签: php ternary-operator