2011-12-29 27 views
1

VS2005コンパイラを使用していますが、次のコードでコンパイルエラーが発生すると予想しています。次のコードでコンパイルエラーが発生しないのはなぜですか?

int a=1, b= 2, c=3; 
a = (b,c); 

私の理解によると、コンパイルエラーが発生するはずです。

この背後に正当な理由があるかどうかはわかっています。

+0

なぜこれはコンパイルエラーですか? 2行目の最後にセミコロンを忘れてしまった場合を除きますか? –

+0

まず、*なぜ*これをコンパイルエラーにしたいですか? –

+0

より完全なサンプルを投稿すると、**あなたのコードが**コンパイルエラーを引き起こすので、末尾のセミコロンがなく、そのスコープで値を割り当てることはできません。以下は、あなたが期待していることを反映していますか? int main(){int a = 1、b = 2、c = 3; a =(b、c)。 } – bacar

答えて

5

C++でコンマ演算子を使用していますが、一般的には使用されません。

<expression1>, <expression2> 

それは<expression1>を評価し、結果を破棄して、<expression2>を評価し、それが式全体の値として返された結果を受け取りにこれは次のように動作します。

+0

なぜこのようなことが必要ですか?ちょっと興味があるんだけど。 – Vijay

+0

これは、for-loopsのヘッダーやその他のいくつかのケースで複数のことを行うのに使用されることがあります。一般的に、ほとんどの人は、それが存在していてもC++がなくてもうまくいくことを知りません。 – Thirler

1

このコードにはエラーはありません。なぜあなたはコンパイルエラーがあるべきだと思いますか?ここにあるのはcomma operatorで、すべてのパラメータを評価しますが、右辺の値を返します。この場合は3です。

6

コードの唯一の誤りは、2行目の最後にセミコロンを忘れてしまったということですが、質問の実際の推力ではなく、質問を構成する際に誤植であったと思います。

表示されたコードでコンパイルエラーが発生する理由はありません。それは私のためにうまくコンパイルし、aの値が、実際には、3

See for yourselfです:次のコードは3を返します。

int main() 
{ 
    int a=1, b= 2, c=3; 
    a = (b,c); 

    return a; 
} 

トリックはそのを評価comma operatorの使用であり、結果を破棄してから、第2オペランドを評価し、その値を返します。

ただし、Charles Baileyというメモでは、関数内の質問に示されているコードをラップする必要があります。そうしないと、どのコンパイラでもコンパイルエラーが発生します。 C++では、関数外の代入文は許可されません。

1

http://en.wikipedia.org/wiki/Comma_operatorを引用する:

「CおよびC++プログラミング言語を、(トークンによって表される)コンマ演算子は、その最初のオペランドを評価し、結果を破棄し、バイナリ演算子であり、その後評価します第2オペランドを返し、この値を返します(そしてタイプ)。カンマ演算子は、C演算子の中で最も優先度が低く、シーケンスポイントとして機能します。

1

VS2005でこれをテストしたところ、コンパイルエラーが予想どおりに発生しました。

Compiling... 
main.cpp 
d:\dev\work\comptest\main.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
d:\dev\work\comptest\main.cpp(2) : error C2374: 'a' : redefinition; multiple initialization 
     d:\dev\work\comptest\main.cpp(1) : see declaration of 'a' 

宣言行は問題ありませんが、期待通りに代入文は関数の外部では有効ではありません。コンパイラは、aをデフォルトのint型(どちらも正当ではない)で再初期化しようとしているように見えます。

+0

私はこの答えが欠けていると思っています。疑問は、それが*コンパイルされ、「a」が3の値になることに驚いていることを合理的に明らかにします - 不完全なスニペットを貼り付けたと合理的に結論できますか? – bacar

+1

@bacar:私は自分の答えを立てています。投稿されたコードはコンパイルされません(ポスターが予期しているように、どうしたらいいのでしょうか?それがポスターのためにコンパイルされたら、彼は何か間違ったことをしました。私は彼のコンパイラでコードをテストするのに苦労したので、これが彼が矛盾を見つけるのを助けることを願っています。 –

関連する問題