1

そこで、C++ で初期化されていない配列を作成し、最後の要素を出力して、出力がどうなるかを確認しました。初期化されていない配列のすべての要素の値は 0 でなければなりませんが (そうですか?)、得られた出力は別のものでした。メイン関数は次のようになります。

int main() {
    int i[5];
    cout << i[4] << '\n';
}

この出力を実行する1606416656と(毎回同じ数)、改行があります。ただし、に変更'\n'するとendl、出力が0改行付きに変更されます。

何故ですか?

また、 を使用しても正しく出力されi[3]ずに印刷しようとします。なんで?i[4]0'\n'

'\n'私はいくつかの調査を行い、「バッファをフラッシュ」しない場所を読みendlました。この「ストリームのフラッシュ」は実際にはどういう意味ですか?これが出力に影響を与えているのですか?

4

3 に答える 3

2

初期化されていない配列のすべての要素の値は 0 でなければなりません (そうですか?)

いいえ、不確定な値です。値を使用すると未定義の動作が発生するため、予測できない出力が得られます。

この「ストリームのフラッシュ」は実際にはどういう意味ですか?これが出力に影響を与えているのですか?

ストリームに書き込むと、出力はメモリ バッファーに格納され、最終的な宛先 (コンソール、ファイルなど) にすぐに送信されるとは限りません。これにより、パフォーマンスが大幅に向上しますが、必要なときに最終出力が表示されないことも意味します。ストリームをフラッシュすると、書き込んだデータが最終的な宛先にプッシュされます。

于 2014-04-04T11:03:06.983 に答える
1

配列は初期化されていないままです。あなたが得るどんな値も偶然です。std::endl は改行文字を挿入し、出力ストリーム バッファーをフラッシュします。これが std::endl マニピュレータと改行文字のみの出力の違いです。

于 2014-04-04T11:02:51.623 に答える
1

スタック上に新しく作成された配列がゼロで初期化されるという仮定は当てはまりません。したがって、出力はランダムです。プログラムを変更すると、メモリ レイアウトが並べ替えられるため、異なる結果が表示されます。

int main() {
    int i[5];
    for (int k = 0; k < 5; ++k)
        i[k] = 0;
    cout << i[4] << '\n';
}

'\n' または endl の使用に関係なく、常に期待される結果が得られるはずです

于 2014-04-04T11:12:57.890 に答える