You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双重三元运算符返回意外结果:为何$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:43:35