速度を言語のせいにしないでください。その属性は言語の実装に属します。速い実装と遅い実装があります。高速な実装に関連する最適化があります。十分に最適化されたマシン コードを生成するコンパイラは、初期化が不要であると推測できる場合、初期化を最適化します。
この場合、実際には初期化が必要です。scanf が失敗したかどうかを検討してください。scanf が失敗すると、戻り値はこの失敗を反映します。次のいずれかが返されます。
- 読み取りエラーまたは EOF (実装で定義された方法でトリガーされる可能性があります。通常、Windows では CTRL+Z、Linux では CTRL+d) があった場合はゼロ未満の値。
- 変換エラーが発生した場合 (たとえば、scanf に指示したときに stdin に「a」を入力した場合) は、scanf に提供されたオブジェクトの数よりも少ない数 (オブジェクトを 1 つしか提供していないため、この失敗の戻り値は 0 になります) '0'..'9' のシーケンスを整数に変換します)、
- scanf が割り当てることができたオブジェクトの数。あなたの場合、これは1です。
これらの戻り値 (特に #3) のいずれもチェックしていないため、コンパイラは初期化が必要であると推測できず、最適化して取り除くことができません。変数が初期化されていない場合、これらの戻り値のチェックに失敗すると、未定義の動作が発生します。ニワトリは、頭がなくても生きているように見えることがあります。scanf の戻り値を確認することをお勧めします。そうすれば、変数が初期化されていない場合は、初期化されていない値の使用を避けることができ、そうでない場合は、変数を使用するのではなく、エラー メッセージを生成して誤った戻り値を処理すると仮定して、コンパイラが初期化を最適化できます。
編集:未定義の動作のトピックについては、次のコードで何が起こるかを検討してください。
if(number < 0)
number= -number;
number が -32768 で INT_MAX が 32767 の場合、-(-32768) は int として表現できないため、C 標準のセクション 6.5、パラグラフ 5 が適用されます。
セクション 6.5、パラグラフ 5 は次のように述べています。
式の評価中に例外的な条件が発生した場合 (つまり、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合)、動作は未定義です。