次のコードは、「無効な初期化子」エラーを示します。
int a[]=(1,2,3);
ただし、以下は「、」をSEPARATORではなくコンマOPERATORと見なしますが、正常にコンパイルされます。
int a[][2]={(1,2),(3,4)};
では、なぜ()
1Dアレイでは無効であり、2Dアレイでは無効なのですか?
次のコードは、「無効な初期化子」エラーを示します。
int a[]=(1,2,3);
ただし、以下は「、」をSEPARATORではなくコンマOPERATORと見なしますが、正常にコンパイルされます。
int a[][2]={(1,2),(3,4)};
では、なぜ()
1Dアレイでは無効であり、2Dアレイでは無効なのですか?
最初の例では:
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}};
意図に応じて。
最初の例では、中括弧を忘れました。称賛(中括弧)は、配列の内容の初期化を示し、内容はそれらの称賛内の宣言によって処理されます。基本的に、最初の例では配列を初期化していない。括弧は、関数の場合のように引数ではなく、評価の順序を示します。