プロが教える店舗&オフィスのセキュリティ対策術

配列の初期化子について、以下のような事がありました。

1. 一般に教科書で言われている事ですが、int a[3]={1} ; で初期化すると a[0]=1,a[1]=0,a[2]=0と初期化子が与えられていない要素は0で初期子されます。
2. 今度は,意地悪く全ての要素に初期化子を与えない a[3]={ } ; で初期化すると a[0]=0.a[1]=0, a[2]=0. と全てが0で初期化されました。←問題点
3. 初期化子を与えない int a[3] ; では a[0] a[1] a[2] は当然ながら不定値で初期化されます。

1と3については教科書通りですが、2についてはどの様に説明する事ができるのでしょうか。
標準Cに規定があるのでしょうか。それとも環境(コンパイラ)によるものでしょうか。尚私はRed Hat Linuxを使っています。
宜しく願います。

A 回答 (4件)

初期化子は、



initializer:
    assignment-expression
    { initializer-list }
    { initializer-list , }

initializer-list:
    designation(opt) initializer
    initializer-list , designation(opt) initializer

ですので、少なくともひとつは式が必要です。
式が何も無い場合は未定義の動作になります。

この回答への補足

いつもご回答有難うございます。再質問ですが
initializer-list:
    designation(opt) initializer
    initializer-list , designation(opt) initializer
の部分が解りません。designation(opt) initializerがオプションならば少なくともひとつは式が必要という結論が何処から出たのか理解できません。ご教授くだされば幸いです。

補足日時:2008/06/20 04:38
    • good
    • 0
この回答へのお礼

ひととうりC言語を終わり、更にステップアップをめざしていますが、その時基礎を徹底的にやり直そうとしている段階です。
いつもご回答有難うございます。

お礼日時:2008/06/21 04:08

> designation(opt) initializerがオプションならば



designationだけがオプションであって、
initializerには(opt)が付いていないので必須、
じゃないのでしょうか。
    • good
    • 0

int a[3] = {};



Borland C compilerでやったらエラーになりました
式が必要だそうです。
環境依存ですね。
    • good
    • 0

動作規定に何もないのだから、そのコンパイラの解析処理の結果でしょう。

数値文字列をどうやって数値に変換するか想像してみれば分かるのでは?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!