2017-01-08 11 views
1

C++、このコードで条件演算子の結合性

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"; 

本は言う:?演算子は右結合です。私はインターネット検索をしたので、結合性の意味を理解しています。しかし、私は本当に上のコードの意味を理解できません。 C++は何をして始めるのですか?この操作は左から開始し、最初の条件を実行し、必要であれば第2の条件を実行することによって続行する必要があるため、連想のままにしておく必要があります。

+0

として扱われていますか? (真ならば何をすべきか):(偽なら何をするか)。 – mamun

+0

の説明を検討してください。http://stackoverflow.com/questions/7407273/why-is-the-conditional-operator-right-associative –

答えて

1

?:を連想放置した場合、ステートメント

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"; 

が扱われますas

finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass"; 
(この場合) "high pass"(grade < 60)には異なるタイプがあるため、コンパイルできませんでした(

)。

それは実際に右結合であるので、文はそれは(条件)として読まれるべきである

finalgrade = (grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass"); 
0

これはかなり翻訳されます:

最終グレードのマークは90を超えていますか?もしそうなら、それはハイパスと考えられます。それ以外は60歳以下ですか?もしそうなら、それは失敗とみなされます。結果が90以上または60未満の場合は、単に「合格」とみなされます。

2

オペレータの結合性は、最初に実行されるものとは関係ありません。あなたはオペレータ@を持っている場合は、関連性は

a @ b @ c 

あなたのケースで
(a @ b) @ c 

または

a @ (b @ c) 

、右のような? ... :作品として読まれるべきであるかどうかを示します連想演算子:

(grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass" 

つまり
(grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass") 

として解析し、最初の?:の "他の枝" とは、別のネストされた?:が含まれています。

(それが左結合であれば、それはほとんど意味がない

((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass" 

、だろう。)

+0

"オペレータの関連性は、最初に実行されるものとは関係ありません。"しかし '(a @ b)@ c'では' b @ c'ではなく 'a @ b'が必ず最初に実行されますか? – artm

+1

@artm '(f()@ g())@h()'を考えてみましょう。どの関数が最初に呼び出されたのか分かりません。私の声明では、私は 'a'、' b'、 'c'の実行を指していました。 – melpomene

+1

@artmでも、 'a &&(b && c)'を考えてみてください。 C++では 'b && c'は' a'が 'false'ならば、最初の' &&'が直ちに 'false'を返すので、最初に実行することはできません。 – melpomene