2011-07-07 2 views
6

条件演算子を使用しているときに私は奇妙なコンパイルエラーが発生しました。C++の条件演算子は、私にとって何が他にありますか?

a,bintであり、次の式はコンパイルエラーとなります。

(a>b)?(std::cout << a) : (std::cout<<b); 

奇数である。しかし、この表現がうまく機能

(a>b)?(std::cout << a) : (b=MAX); 
16 (b <unknown operator> 5)' 

(a>b)?(a=MAX) : (std::cout<<b); 
16 (&std::cout)->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](b)' 

は、..私は、このような違いは何見当がつかない、とコンパイルエラーが放置理由を知りません。ここに私のgccの情報です:

Reading specs from ./../lib/gcc/mingw32/3.4.2/specs 
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host= 
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable 
-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e 
nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja 
va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz 
ation --enable-libstdcxx-debug 
Thread model: win32 
gcc version 3.4.2 (mingw-special)` 
+1

条件式に副作用を入れたステートメントを置くことはかなり醜いです。なぜ伝統的なif文を使用しないのですか? –

+0

@Johannes:私はあなたのコメントを非構造的としています。なぜ単にあなたが失礼ではなく、質問をあまり嫌うのかを説明するコメントはありませんか? –

+0

@ブリーナン私は、質問者がそれをよく知っていると思います。私はそれを編集して修正しようとしましたが、理解できません。私は関数のように呼ばれる16を見たことがなく、がC++で使われることはありませんでした(それはGCC診断でもありません)。あなたの質問を適切に書式化しないでSE上に1年以上いる場合は、少なくとも他の人が書式設定できる形式で書かなければなりません。だから私は-1です。実際に役に立たないことがわかったので、私は他のコメントを削除しました。 –

答えて

14

条件演算子は常に同じ型を返す必要があります。最初の例では、

(a > b) ? (std::cout << a) : (b = MAX); 

最初の分岐型std::ostreamが得られ、第二の分岐は、(そのコンテキスト与え、そう整数)bのタイプをもたらします。両方のブランチが同じ型を返すので、あなたの第二の例では、

(a > b) ? (std::cout << a) : (std::cout << b); 

std::ostream、そのような問題を持っていません。いずれの場合も、単純なif - elseステートメントでこれらの条件を処理する方がよりクリーンである可能性があります。

int a = (a > b) ? a : b; 
std::cout << a; 
+5

(世界的に答えが私のものよりも優れているので)ちょうどいいですが、 'b?'と 'c'は' a? b:c'は少し複雑です。基本的に、コンパイラは型の一方を他方に変換できる必要があります。だから、 'long'と' int'、 'Base *'と 'Derived *'( 'Derived1 *'と 'Derived2 *'ではなく)を使うことができます。代わりに、式の1つは 'throw'式にすることができます。その場合、式のタイプはもう1つのタイプです。 –

+0

実際、 'void * p = 0; (a> b)? (std :: cout << a):(p = malloc(1)); 'は完全に良いでしょう。 –

+6

これを修正するもう一つの方法は、コンマ演算子を使うことです: '(a> b)? ((std :: cout << a)、a):(b = MAX); 'これは、コードをさらに不明瞭にするという追加の利点があります。 ;) –

4

?:式(またはサブ式)で演算子である:条件付き変数に割り当てる場合条件演算子は、読みやすさを傷つける傾向があり、典型的にのみ有効です。式には型があります。 (a > b) ? (std::cout << a) : (b = MAX)のタイプはどうすればよいですか。 C++の型は静的に評価され、コンパイラがstd::cout << a(型std::ostream&)とb = MAX(型int)の共通型を判別する方法はありません。

+0

はい、ここの鍵は、その部分です。_ "式の型が" _です。 –

2

他にC++の条件演算子は私にとって何をしますか?

これは、第2引数と第3引数の型が一致しており、式から型を抽出する方法として非常に役立ちます。条件演算子のその機能を使用する方法に関する記事を読むには、here