質問: {3, 2, 0, 2, 1, 4}; > > ``` > > と書かれていました。 この、「自動変数の配列は初期化できません」が良く分かりません。 最初は、「自動変数として配列を宣言した場合は初期化できない」という事なのかと思ったのですが、 以下のコードで考えてみると、それは違うようです。 ``` #include void tekitou(void); int main(void) { tekitou(); tekitou(); return 0; } void tekitou(void) { // auto int room[]={3,2,0,2,1,4}; static int room[]={3,2,0,2,1,4}; // int room[]={3,2,0,2,1,4}; for (int i=0;i
回答: はい、その解説は古いもので、現在は仕様が変わっているだけです。 以下は蛇足。プログラム言語 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") の仕様は歴史的に4つにわけることができます。 * 最初の C : Dennis Ritchie が作ったもの(オレオレプログラム言語の1つでしかなかった) K&R 本の古いものはこれを解説しています。 * C89 : `ANSI X3.159-1989` 米国国家規格協会で定めた米国内規格 俗に ANSI-C と呼ばれているものはこれです。 K&R 本の新しいもの (ANSI 対応と書いてあるもの) はこれを解説しています。 C90 : C89 をほぼそのまま `ISO/IEC 9899:1990` として国際規格にしたもの C95 : `ISO/IEC 9899/Amd1:1995` 微小な改正 Amendment があって追補の形で規格改正されています。多国語対応のための機能追加があったので日本人はもっと知っておくべきなんですけどね。多くのプログラマは C90 と同じものとして扱っています。 このような事情により ANSI-C/C89/C90/C95 は同じ規格と考えてよいです。 * C99 : `ISO/IEC 9899:1999` として国際規格が改定されたもの 市販されているコンパイラの多くはこれに各ベンダが独自の拡張を施したものです。 * C11 : `ISO/IEC 9899:2011` として国際規格が改定されたもの このコメント書いている時点では、パソコン向けコンパイラは対応が進んでいますがマイコン向けコンパイラは対応していないものがほとんどです。 `ISO/IEC 9899` を日本語に翻訳したものが JIS 規格 `JIS X 3010` として採用されています。オイラは今その「本」(紙ですね)を参照してこのコメントを書いています。 最初の C では自動変数として定義された配列の初期化はできませんでした。お持ちのその本はおそらく K&R 本の古いやつで、「最初の C 」の解説をしているのだと思われます。 C89 では仕様が変更されており、配列の自動変数も初期化できることになっています。 `JIS X 3010-1993` の 6.5.7 初期化 の章の注釈 (74) にて「参考文献1と異なり、自動記憶域期間をもつ任意のオブジェクトを初期化できる」となっています。今オイラが見ている紙の本では検索が効かないので参考文献1が何かを確認できませんが、おそらくあなたの持っている K&R 本を指しているはずです。 C99/C11 でもその辺の事情は変わっていませんので「できる」ことになっています。