静的変数に値 0 が割り当てられるのはなぜですか?
3 に答える
0 に初期化することは理にかなっています。これにより、物事がより予測しやすくなります。おそらく、「スタック変数が初期化されないのはなぜですか?」という疑問が生じるはずです。
これに対する答えはパフォーマンスかもしれません - 関数に入るたびにスタック変数の初期化を行う必要があり、初期化が実際に必要ない場合は時間が無駄になる可能性があります。静的変数はプログラムのロード時に初期化されるため、それほどコストはかかりません。
標準はこれが真実であることを義務付けているからです。
C99標準の§6.7.8.10は次のように述べています。
自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:
— ポインター型の場合、null ポインターに初期化されます。
— 算術型の場合、(正または符号なし) ゼロに初期化されます。
— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。
— 共用体の場合、最初の名前付きメンバーは、これらの規則に従って (再帰的に) 初期化されます。
これらは、実行時のパフォーマンスの低下を招くことなく初期化できる唯一の変数ストレージ クラスであるためです。
自動ストレージ クラス変数 (デフォルト) は、使用されない可能性があるため初期化されません。関数内の静的変数は、関数が初めて呼び出されるまで初期化されることが保証されていません。
ゼロは、いくつかの理由で賢明な一般的なデフォルト初期化子です。char 配列では、空の文字列を生成し、配列インデックス カウントを開始し、NULL ポインターを生成します。
個人的には、ゼロであっても常に明示的に静的を初期化します。これは部分的にドキュメンタリーです。言い換えれば、「私は本当にゼロが欲しいので、変更しないでください」.