php与java中的嵌套三元运算符关联性

php与java中的嵌套三元运算符关联性,java,php,ternary-operator,Java,Php,Ternary Operator,所以,我刚读到,我被“三元运算符是左关联的”部分弄糊涂了,所以我在解释器中运行了示例代码: $arg = 'T'; $vehicle = ( ( $arg == 'B' ) ? 'bus' : ( $arg == 'A' ) ? 'airplane' : ( $arg == 'T' ) ? 'train' : ( $arg == 'C' ) ? 'car' : ( $arg == 'H' )

所以,我刚读到,我被“三元运算符是左关联的”部分弄糊涂了,所以我在解释器中运行了示例代码:

$arg = 'T';
$vehicle = ( ( $arg == 'B' ) ? 'bus' :
             ( $arg == 'A' ) ? 'airplane' :
             ( $arg == 'T' ) ? 'train' :
             ( $arg == 'C' ) ? 'car' :
             ( $arg == 'H' ) ? 'horse' :
             'feet' );
echo $vehicle;
事实上,它返回了
horse
,这是博客文章中的反直觉观点

出于好奇,我试图通过重新编写来满足我认为“左联想”的需求,从而“使这项工作成功”。我明白了(格式很奇怪,但至少在我的脑海里会更清楚):

现在,这正如预期的那样工作,因为任何字符
$arg
都返回以该字符开头的车辆(当然是小写,但这在这里并不重要)

更奇怪的是,因为我不清楚为什么前者不起作用,我想知道后者是否会在正确的联想语言中失败,因为它似乎不会。所以我在java解释器中测试了它。这里的代码适用于任何想节省几秒钟时间的人

class Main {
  public static void main(String[] args) {


    Character arg = 'a';
    String vehicle = ( ( arg == 'B' ) ? "bus" :
                        ( arg == 'A' ) ? "airplane" :
                        ( arg == 'T' ) ? "train" :
                        ( arg == 'C' ) ? "car" :
                        ( arg == 'H' ) ? "horse" :
                        "feet" );
    System.out.println(vehicle);
    vehicle = ( ( arg != 'B' ) ? 
                    ( arg != 'A' ) ? 
                        ( arg != 'T' ) ? 
                            ( arg != 'C' ) ? 
                                ( arg != 'H' ) ? 
                                "feet" :
                            "horse" :
                        "car" :
                    "train" :
                "airplane" :
            "bus"
    );
    System.out.println(vehicle);
  }
}
这两种格式都在java中工作。那么,php提供了什么?我听说它本质上是在评估前导等式作为最终等式(
$arg=='H'
)。但如果是这样的话,那就意味着它的行为就像是

$vehicle = ((($arg == 'B') || ($arg == 'A') || ($arg == 'T') ||
             ($arg == 'C') || ($arg == 'H')) ? 'horse' : 'feet');
这对我来说没有意义。在我给出的第二个php示例中,我只移动了等式的位置,嵌套在三元表达式的
if true
部分,而不是
if false
部分。我不明白为什么第一种方法不起作用,如果第二种方法起作用。这似乎更像是一个错误,而不是“这就是它应该如何工作”,我只是误解了事情,我必须这样


注意:我知道我可以把括号括起来,强制表达式按我想要的方式计算(这显然是正确的)。我不是在寻找“如何使它工作”,我想知道为什么它不工作。

将多个运算符串在一起时,左关联与右关联是关于优先级的,例如
A+B+C

对于三元运算符
A?B:C
,这仅在额外三元运算符替换
C
部分(或
A
部分)时才有意义:

A?B:X?Y:Z

(A?B:X)?哦,我想我明白了。由于
X
不是
0
或任何其他计算结果为
false
,因此最终计算结果为Y。因此在第一种情况下,
$arg=='B'
$arg=='A'
$arg=='T'
火车
计算为
汽车
计算为
最终值为
?@MiaoLiu你明白了吗结论:左结合三元算子是一个非常糟糕的设计。或者总结一下:PHP是糟糕的设计。这意味着,在Java中,首先计算嵌套最深的三元数,然后将该表达式的结果用作外部表达式的返回值之一。然后将对外部表达式求值,并将其返回值用于下一个外部语句,等等。正确吗?@Ungeheuer不完全正确。别搞混了。
$vehicle = ((($arg == 'B') || ($arg == 'A') || ($arg == 'T') ||
             ($arg == 'C') || ($arg == 'H')) ? 'horse' : 'feet');