一尘不染

三元运算符左联想

php

在PHP手册中,我在“操作员”下找到以下“用户提供的说明
”。

请注意,在php中,三元运算符?:具有左联想性,与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'

我实际上尝试过,它确实可以打印four。但是我不明白它背后的原因,仍然觉得它应该打印two或显示other

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


阅读 414

收藏
2020-05-29

共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';
2020-05-29