三元算子左结合性

2022-08-30 11:10:14

在PHP手册中,我在“运算符”下找到了以下“用户贡献说明”。

请注意,在 php 中,三元运算符 ?: 与 C 中不同,在 C 中具有左结合性,在 C 中,它具有右结合性C++。

你不能像这样编写代码(正如你可能在C/C++中习惯的那样):

<?php 
$a = 2; 
echo ( 
    $a == 1 ? 'one' : 
    $a == 2 ? 'two' : 
    $a == 3 ? 'three' : 
    $a == 4 ? 'four' : 'other'); 
echo "\n"; 
// prints 'four' 

我实际上尝试了它,它真的打印了。然而,我无法理解它背后的原因,仍然觉得它应该打印或.fourtwoother

有人可以解释一下这里发生了什么,为什么它打印“四”吗?


答案 1

在任何理智的语言中,三元运算符都是右结合的,因此您会期望您的代码被解释为如下:

$a = 2;
echo ($a == 1 ? 'one' :
     ($a == 2 ? 'two' :
     ($a == 3 ? 'three' :
     ($a == 4 ? 'four' : 'other'))));    # prints 'two'

但是,PHP 三元运算符奇怪地左结合,因此您的代码实际上等效于此:

<?php
$a = 2;
echo (((($a == 1  ? 'one' :
         $a == 2) ? 'two' :
         $a == 3) ? 'three' :
         $a == 4) ? 'four' : 'other');   # prints 'four'

如果仍然不清楚,评估如下:

echo ((((FALSE    ? 'one' :
         TRUE)    ? 'two' :
         $a == 3) ? 'three' :
         $a == 4) ? 'four' : 'other');

echo ((( TRUE     ? 'two' :
         $a == 3) ? 'three' :
         $a == 4) ? 'four' : 'other');

echo ((  'two'    ? 'three' :
         $a == 4) ? 'four' : 'other');

echo (    'three' ? 'four' : 'other');

echo 'four';

答案 2

因为整个表达式的计算结果就像是 .由于第一个元素可能是真实的东西,因此它为您提供了 .在更理智的语言中,具有正确的结合性,整个表达式的计算方式就好像它是,如果不是,你继续测试其他东西。(......) ? 'four' : 'other''four'?:$a == 1 ? 'one' : (......)$a1


推荐