配列を初期化するときa[][]
:
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
次に、配列要素を表示します。
なぜ私は得るのですか:
11 89 0 0 0
0 0 0 0 0
ここで最初の角かっこの代わりに中かっこを使用するとどうなりますか?
配列を初期化するときa[][]
:
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
次に、配列要素を表示します。
なぜ私は得るのですか:
11 89 0 0 0
0 0 0 0 0
ここで最初の角かっこの代わりに中かっこを使用するとどうなりますか?
(8,9,7,67,11)
は、11と評価されるコンマ演算子を使用した式です。他のイニシャライザーについても同じことが言えます。したがって、最初の2つの要素のみを明示的に初期化し、他のすべての要素は0に初期化されます。コンパイラーは、初期化子に中括弧のレベルがないことを警告する必要があります。
中括弧を使用する場合はa
、おそらく意図されているように、の2つのコンポーネント配列を初期化します。
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
(ブロックスコープで)と同等です:
int a[2][5]={11, 89};
,
Cコンマ演算子です。オペランドを左から右に評価し、右のオペランドの値を生成します。
ファイルスコープでは、配列初期化子は定数である必要があり、,
式は定数式ではないため、配列宣言は無効です。
中かっこではなく括弧を使用しているためです。あなたが欲しい:
int a[2][5] = { { 8,9,7,67,11 }, { 7,8,9,199,89 } };
// ^^^ ^^^^^^ ^^^
元のコードでは、コンマ演算子を知ったばかりで、実際にを記述していint a[2][5] = { 11, 89 };
ます。これは合法ですが、欠落しているすべての要素をゼロに初期化します。
これはの概念であり、配列を初期化
するために使用する必要がありcomma operator
ますcomma separator
{}
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
ここで(8,9,7,67,11)
は、コンマ演算子が評価され、右端の値が返される値である11
ため、forcomma operator
と(7,8,9,199,89)
同等です。89
left to right
したがって、それはと同等ですa[2][5]={11,89}
しかし(8,9,7,67,11),(7,8,9,199,89)
、で使用されるコンマ() , ()
はcomma separator