2016-02-19 36 views
5

所以,我剛剛讀了this blog post,我對「三元運算符是左關聯」部分感到困惑,所以我在解釋器中運行示例代碼:在java vs java中嵌套的三元運算符關聯性

$arg = 'T'; 
$vehicle = (($arg == 'B') ? 'bus' : 
      ($arg == 'A') ? 'airplane' : 
      ($arg == 'T') ? 'train' : 
      ($arg == 'C') ? 'car' : 
      ($arg == 'H') ? 'horse' : 
      'feet'); 
echo $vehicle; 

事實上,它返回horse這是在博客文章中的點的反直覺性。

出於好奇,我試圖通過重寫它來適應我認爲的「左聯合」想要的「做這項工作」。我得到這個(格式是怪異,但它使至少清晰的在我腦海中):

$arg = 'T'; 
$vehicle = (($arg != 'B') ? 
       ($arg != 'A') ? 
        ($arg != 'T') ? 
         ($arg != 'C') ? 
          ($arg != 'H') ? 
           'feet' : 
          'horse' : 
         'car' : 
        'train' : 
       'airplane' : 
      'bus' 
); 
echo $vehicle; 

現在,這個工程預期在這個意義上,什麼都性格$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部分。我不明白爲什麼第一種方法如果第二種方法不起作用。這看起來更像是一個錯誤,而不是「它應該如何工作」,而我只是曲解事情,我必須這樣做。

注:我知道我可以只包裝事物的括號以強制表達式以我想要的方式進行評估(顯然是右聯合的)。我不是在尋找「如何做這項工作」,我想知道爲什麼它沒有。

回答

2

將多個操作符串連在一起時左 - 右關聯優先於優先級,例如, A + B + C

對於三元運算符A ? B : C,這僅具有意義時,額外的三元運算符替換C部分(或A部分):

A ? B : X ? Y : Z 
(A ? B : X) ? Y : Z <-- left-associative (PHP) 
A ? B : (X ? Y : Z) <-- right-associative (Java, C, C++, C#, Perl) 

如果額外三元運算符被插入在中間(替換B) ,它只能有一個含義:

A ? X ? Y : Z : C 
A ? (X ? Y : Z) : C 

這就是爲什麼PHP和Java同意第二個。沒有應用左/右聯合規則。

+0

哦,我想我明白了。由於'X'不是'0'或其他任何評估爲'false'的,因此最終評估值爲Y.因此,在第一種情況下,'$ arg =='B'是'false'...'$ arg =='A''是'false' ...'$ arg =='T''是'true' ... ...'train'評估爲'true' ...'car'評估爲'true'。 ..最後的價值是'馬'? –

+0

@MiaoLiu你明白了。 ---結論:左聯三元算子是一個非常糟糕的設計。或者總結[鏈接的博客](http:// eev。ee/blog/2012/04/09/php-a-fractal-of-bad-design /):* PHP是糟糕的設計*。遠離。 – Andreas

+0

所以這意味着,在Java下,首先評估嵌套最深的三元組,然後將該表達式的結果用作外部表達式的返回值之一。然後,外部表達式將被評估,並將其返回值用於下一個外部語句等。正確? – Ungeheuer