私はJavaで配列の基礎を学ぼうとしていましたが、この質問が発生しました:
バージョン 1:
int[] x = {12,34,56,78};
バージョン 2:
int[] x;
x = {12,34,56,78};
バージョン 1 は正しいですが、バージョン 2 は正しくありません。
これはなぜですか?その背後にある物語は何ですか?これをコンパイラ指向の観点
から説明してください。
int x[] = {12,34,56,78};
この場合、コンパイラは 4 つの整数を格納する必要があることを認識しています。これは、 と言うことに匹敵しますint x[4]
。
int x[];
/* ... */
x = {12,34,56,78};
ただし、この場合、コンパイラはint x[]
、配列にスペースを割り当てる必要があることを認識して認識していますが、次の行に到達するまでどの程度のスペースを割り当てるかを認識していません。
後者の場合、コンパイラが処理する必要がある最初の行はint x[];
. int x[4];
コンパイラは、長さを指定するか初期値を指定して長さを決定できるようにしない限り、配列の長さを知りません。
これが理由です
これは、配列初期化構文を使用した変数の宣言と初期化です。
int[] x = {12,34,56,78}; // this is java. my bad
int x[] = {12,34,56,78}; // this is c
これは変数宣言です:
int[] x; // java again
int x[]; // this is c
変数を宣言するときのみ、変数の初期化 (配列初期化構文の使用を含む) が許可されます。
これは、構文エラーのある変数の割り当てです。
x = {12,34,56,78};
シンプル... バージョン 2 は、配列値にスペースを割り当てる方法を認識していません
ここで割り当てのように見えるのは、実際には初期化です。このような構文は、宣言の一部としてのみ使用できますが、スタンドアロンの式では使用できません。
この構文の 2 つの部分 (=
符号の左側と右側) は連携して機能します。コンパイラはint x[]
、初期化子の項目数から配列のサイズを導き出します。x
C 配列のサイズは宣言の時点でわかっている必要があるため、後で、つまり代入が行われたときに、の型に追加することはできません。