2011-01-22 12 views
5

C優先順位テーブルに従って、三項条件演算子は右から左に の結合性を持ちます。さらに別の条件演算子入れ子の質問

それで、それは同等のif-elseラダーに直接変換可能ですか?例えば

、 できます。

は単に解釈さ

x?y?z:u:v; 
:(他一致:)(もし最も近い不対とによって

if(x) 
{ 
    if(y) 
    { z; } 
    else 
    { u; } 
} 
else 
{ v; } 

)?あるいは、右から左への連合性は、他の取り決めを暗示していますか?

答えて

14

あなたが唯一の三項演算子が右に持っていたかどうか、(あなたが与えたif文のような)一つの方法で解釈することができた例左または右から右への連想。右から左結合性の問題は、あなたが持っているときである

:ないx = (a ? b : c) ? d : eとして、x = a ? b : (c ? d : e):として解釈され

x = a ? b : c ? d : e; 

。より現実的な例を与えることを

:文/ ELSE-IF場合

int getSign(int x) { 
    return x<0 ? -1 : 
      x>0 ? 1 : 
        0; 
} 

これは(おそらくより読みやすい)と同じです。

int getSign(int x) { 
    if (x<0) 
     return -1; 
    else if (x>0) 
     return 1; 
    else 
     return 0; 
} 
5

あなたの前提は正しいです。しかし、例えば、読みやすくするために括弧で追加することが多いが賢明です:

x?(y?z:u):v 
+2

+1、私はそれもありだと思いますが、 wiser *実際のプロダクションコードで条件演算子をネストするのではなく: –

+0

@PéterTörök:合意しました! – Ray

+3

「使っていない」とは、過大評価されていると思います。 '?'を 'then'と': 'を' else'と置き換えて、あなたは多くの言語で完全に有効な選択構文を持っています。私はこのようなネストされた条件文を常に書き、それぞれ新しいことを確認しますか?と:は、新しい行に正しいインデントで表示されます。 if/elseブロックと同じくらい読みやすい。 –