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

时间:2015-08-27 11:29:52

标签: php ternary-operator

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

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

1 个答案:

答案 0 :(得分:3)

你已经从一个错误的假设开始,这两个代码行是相同的,因为它们不是。三元(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