Java や C# などの言語を調べて、初期化されていないローカル変数を使用すると、コンパイル時エラーが発生します。では、なぜ C & C++ で初期化されていないローカル変数が許可されるのでしょうか? これらの言語がこれを許可する理由は何ですか? これら2つの言語がプログラマーにポインターを含むローカル変数の強制的な初期化を強制し、言語をより安全にする場合、悪い問題の多くは発生しないか、防止できると思います。そうじゃない?
4 に答える
C 言語は、非常に高速で効率的なコードを生成することでよく知られています。
それを念頭に置いて、言語がすべての変数を自動的に初期化しないことは理にかなっています。変数を自動的に初期化する言語では、後でコードで変数を初期化すると、実際には 2 回初期化されるため、効率が悪く、何の役にも立ちません。
C は高度な言語であり、変数の初期化を忘れたり、他の自動化されていないことを忘れたりして問題が発生しないようにするには、経験豊富な開発者がより注意を払う必要があります。
C は、初心者が失敗するのを防ぐのではなく、優れたプログラマーが効率的なコードを記述できるようにするためのツールとして設計されています。初期化されていない変数の使用を許可することは、その方向へのうなずきです。
これは、この記事の適切な説明であり、未定義の動作の一般的な利点について説明しています。
初期化されていない変数の使用: これは一般に C プログラムの問題の原因として知られており、コンパイラの警告から静的および動的アナライザーまで、これらをキャッチするための多くのツールがあります。これにより、すべての変数がスコープに入ったときに (Java のように) ゼロ初期化する必要がないため、パフォーマンスが向上します。ほとんどのスカラー変数では、これによりオーバーヘッドはほとんど発生しませんが、スタック配列と malloc されたメモリでは、ストレージの memset が発生します。これは、特にストレージが通常完全に上書きされるため、非常にコストがかかる可能性があります。
C++ では、C が許可しているため、許可されています。可能であれば、C++ コンパイラは有効な C プログラムを入力として受け入れます。
C: 昔はメモリが少なくて動作が遅かった。まだ初期化を必要としない変数を初期化すると、時間とスペースが無駄になりました。
すべての変数は関数定義の開始時に (多くの場合、それらを初期化する値が判明する前に) 宣言する必要があったため、初期化されていない変数が必要でした。危険だが効率的。世の中にはたくさんのトレードオフがあります。