为什么三元运算符的长形式和短形式的计算方式不同?

Why do long and short forms of the ternary operator evaluate differently?

corresponding nested ternary operator in php? and 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

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

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

因此,如果您逐步进行,您可能会看得更清楚:

第一个三元行:

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

带括号:

echo ((0 ?: 1) ?: 2) ?: 3; //1
      └──────┘                  //0 → FALSE 
       ↓                        //Second expression: 1  
echo ((1) ?: 2) ?: 3; //1
     └────────┘                 //1 → TRUE
      ↓                         //First expression: 1  
echo (1) ?: 3; //1
     └──────┘                   //1 → TRUE
     ↓                          //First expression: 1 
echo 1; //1

第二个三元行:

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

带括号:

echo ((0 ? 0 : 1) ? 1 : 2) ? 2 : 3; //2
      └─────────┘                       //0 → FALSE 
       ↓                                //Second expression: 1
echo ((1) ? 1 : 2) ? 2 : 3; //2
     └───────────┘                      //1 → TRUE 
      ↓                                 //First expression: 1
echo (1) ? 2 : 3; //2
     └─────────┘                        //1 → TRUE 
     ↓                                  //First expression: 2
echo 2; //2