3

次のコードは、「無効な初期化子」エラーを示します。

     int a[]=(1,2,3);

ただし、以下は「、」をSEPARATORではなくコンマOPERATORと見なしますが、正常にコンパイルされます。

    int a[][2]={(1,2),(3,4)};

では、なぜ()1Dアレイでは無効であり、2Dアレイでは無効なのですか?

4

2 に答える 2

8

最初の例では:

int a[]=(1,2,3);

初期化子は、タイプの(かなり奇妙な)式ですint。(2つのコンマ演算子が含まれ、値を生成します3。)オブジェクトは配列です。タイプの不一致であるため、初期化は無効です。

二番目:

int a[][2]={(1,2),(3,4)};

と同等です:

int a[][2] = { 2, 4 };

これは、初期化子でネストされた中括弧を省略できるため有効です。要素は、オブジェクトの連続する要素を初期化するために使用されます。1番目と3番目のコンマはコンマ演算子です。2番目は区切り文字です。

初期化子が、スカラー、構造体、または和集合のいずれであっても、単にターゲット型の式である場合、最も外側の中括弧はオプションです。たとえば、次のように書くことができます。

int x = 42;
int y = { 42 };

要素値を指定する初期化子(配列、構造体、または共用体オブジェクト)には、最も外側の中括弧が必要です。

例えば:

struct foo {
    int x;
    int y;
};

 struct foo arr[2] = { 1, 2, 3, 4 };

は有効ですが、より明確に次のように記述されています。

 struct foo arr[2] = { { 1, 2 }, { 3, 4 } };

最初の例が無効であることを除けば、どちらもスタイルが悪いです。最初のものは次のように意図されていた可能性があります。

int a[] = { 1, 2, 3 };

そして2番目のいずれか:

int a[][2] = { 2, 4 };

また

int a[][2] = {{1, 2}, {3, 4}};

意図に応じて。

于 2012-11-15T09:08:58.233 に答える
2

最初の例では、中括弧を忘れました。称賛(中括弧)は、配列の内容の初期化を示し、内容はそれらの称賛内の宣言によって処理されます。基本的に、最初の例では配列を初期化していない。括弧は、関数の場合のように引数ではなく、評価の順序を示します。

于 2012-11-15T08:58:43.993 に答える