VS2005コンパイラを使用していますが、次のコードでコンパイルエラーが発生することが予想されます。
int a=1, b= 2, c=3;
a = (b,c);
アフターアサインメントの値は3です。私の理解によると、コンパイルエラーが発生するはずです。
この背後に正当な理由があるかどうかを知りたいと思います。
VS2005コンパイラを使用していますが、次のコードでコンパイルエラーが発生することが予想されます。
int a=1, b= 2, c=3;
a = (b,c);
アフターアサインメントの値は3です。私の理解によると、コンパイルエラーが発生するはずです。
この背後に正当な理由があるかどうかを知りたいと思います。
コードの唯一のエラーは、2行目の終わりにあるセミコロンを忘れたことですが、これは質問の実際の推力ではなく、質問の作成における誤植であったと思います。
表示したコードでコンパイルエラーが発生する理由はわかりません。それは私にとってはうまくコンパイルされ、の値はa
実際には3です。
自分の目で確かめてください:次のコードは3を返します:
int main()
{
int a=1, b= 2, c=3;
a = (b,c);
return a;
}
秘訣は、コンマ演算子を使用することです。コンマ演算子は、最初のオペランドを評価してから結果を破棄し、次に2番目のオペランドを評価してその値を返します。
ただし、Charles Baileyが指摘しているように、質問に示されているコードを関数内でラップする必要があります。そうしないと、コンパイラでコンパイルエラーが発生します。C ++では、関数外の代入ステートメントは許可されていません。
C ++でコンマ演算子を使用していますが、一般的には使用されていません。これは次のように機能します
<expression1>, <expression2>
結果を評価<expression1>
して破棄し、その結果を評価<expression2>
して、式全体の値として返されます。
このコードにはエラーはありません。なぜコンパイルエラーがあると思いますか?ここにあるのは、すべてのパラメーターを評価するコンマ演算子ですが、右端のパラメーター(この場合は3)を返します。
http://en.wikipedia.org/wiki/Comma_operatorを引用するには:
「CおよびC++プログラミング言語では、コンマ演算子(トークンで表される)は、最初のオペランドを評価して結果を破棄し、次に2番目のオペランドを評価してこの値(およびタイプ)を返す2項演算子です。演算子は、C演算子の中で最も優先順位が低く、シーケンスポイントとして機能します。」
これを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
、どちらも有効ではありません。