5

3つのコードスニペットがあります。これです:

1,7; //yes, that's all the code

大丈夫コンパイルします。これです:

double d = (1, 7);

コンパイルも大丈夫です。しかし、これは:

double d = 1, 7;

コンパイルに失敗します。gcc-4.3.4は言う

エラー:数値定数の前に非修飾IDが必要です

そしてVisualC++10は言う

エラーC2059:構文エラー:'定数'

なぜそのような違い?,3つすべてが同じ効果でコンパイルされないのはなぜですか?

4

4 に答える 4

13

最初の 2 つのケースでは、ステートメントは C++ のコンマ演算子を使用しています。

後者の場合、カンマが変数の区切りとして使用されており、コンパイラは複数の識別子を宣言することを期待しています。ここではコンマは演算子として使用されていません。

最後のケースは次のようなものです。

float x,y;
float a = 10, b = 20;

これを行う場合:

double d = 1, 7;

コンパイラは、数値定数ではなく、変数識別子を想定しています。したがって、ここでは 7 は違法です。

ただし、これを行うと:

double d = (1,7);

通常のコンマ演算子が使用されています。1 は評価されて破棄され、7 は d に格納されます。

于 2011-12-15T12:10:57.957 に答える
5

違いは、 in1, 7;(1, 7)you には、コンマ演算子が許可されている式があることです。

あなたの最後の例

double d = 1, 7; 

コンマが演算子ではなく区切り記号である宣言です。コンパイラは次のようなものを実行します

double d = 1, e = 7; 

これは正しい変数宣言になります。

コンマは (式の) 演算子である場合もありますが、関数宣言のパラメーター リストなど、他の場所で区切り記号としても使用されることに注意してください。

于 2011-12-15T12:13:59.607 に答える
3
  1. double d = (1, 7);ここでは(1, 7)が最初に評価されます。コンマは逐次評価演算子として機能し、 7に割り当てられdます。

  2. double d = 1, 7;この場合、問題があります: コンマの前の部分は double を宣言してその値を設定することを意味しますが、コンマの後の部分は単なる整数定数であるため意味がありません。

于 2011-12-15T12:17:53.657 に答える
0

最後のものが(間違った)宣言行として扱われるためだと思います:(double d = 1), (7)

于 2011-12-15T12:13:15.707 に答える