双重三元运算符返回意外结果:为何$c取值为'a'而非'tie'?
为什么变量$c的结果是'a'而不是直觉中的'tie'?
先把你给出的代码贴出来,方便对照:
$a = 3; $b = 3; $c = $a === $b ? 'tie' : $a > $b ? 'a' : 'b'; var_dump($c); // 输出 'a'
这个问题的根源在于PHP中运算符的优先级和三目运算符的结合性,和我们直觉的逻辑不一样,一步步拆解给你看:
1. 先明确两个关键规则
- 比较运算符(比如
===、>)的优先级高于三目运算符(?:),所以代码里的所有比较会先执行。 - 三目运算符是左结合的,简单说就是从左往右依次处理,而不是我们直觉里的从右往左嵌套。
2. 一步步拆解执行过程
第一步:先执行所有优先级更高的比较运算
$a === $b→3 === 3,结果是true$a > $b→3 > 3,结果是false
此时原代码的表达式会被简化成:
$c = true ? 'tie' : false ? 'a' : 'b';
第二步:按左结合规则处理三目运算符
左结合意味着先处理最左边的三目表达式:
true ? 'tie' : false→ 因为条件为true,所以返回'tie'
现在表达式进一步简化成:
$c = 'tie' ? 'a' : 'b';
第三步:处理最后这个三目运算
在PHP中,非空字符串会被当作布尔值true,所以'tie'对应的布尔值是true,因此这个三目运算返回第一个分支'a',最终$c的值就是'a'。
3. 如何得到直觉中的'tie'结果?
只要用括号明确指定运算顺序,把右边的三目运算嵌套起来,强制让程序先判断$a === $b,如果为真直接返回'tie',否则再处理后面的比较:
$a = 3; $b = 3; $c = $a === $b ? 'tie' : ($a > $b ? 'a' : 'b'); var_dump($c); // 输出 'tie'
内容的提问来源于stack exchange,提问作者Majid Fouladpour
相关产品推荐
相关产品推荐

