1

コードを書き、gcc コンパイラでテストしました

#include <iostream>

int main()
{
    char arr[ 1000 ];
    for( int index( 0 ); index < 1000; ++index )
    {
        std::cout << arr[ index ] << std::endl;
    }
    return 0;
}

ガベージ値を出力することを望んでいましたが、驚いたことに、何も出力されませんでした。arr のデータ型を char から int に変更しただけで、期待どおりにガベージ値が表示されました。誰かが私にこれを説明してもらえますか?

4

5 に答える 5

4

文字型のオーバーロードは<<、それらを整数型としてではなく、文字として扱います。ガベージ値が印刷可能な文字 (たとえば、 に対応する 97) に対応する'a'場合、それが表示されます。そうでない場合 (例: 0)、そうしません。また、ガベージ値が、端末が黒の背景に黒の前景を使用するエスケープ シーケンスに対応している場合、他には何も表示されません。

a (または任意の文字型) の実際の数値を確認したい場合は、出力する前にchar変数を に変換するだけです。int

std::cout << static_cast<int>( arr[index] ) << std::endl;
于 2012-11-21T16:23:39.377 に答える
2

あなたがやろうとしていることにはがありundefined behaviorます。一部のコンパイラはメモリをクリアし、他のコンパイラはバッファを作成する前の状態のままにします。

全体として、これは役に立たないテストです。

于 2012-11-21T16:16:17.553 に答える
2

一部のプラットフォームでは、たとえばセキュリティ上の目的で、静的ではなく、明示的に初期化されていなくても、初期化されていない char 配列をゼロで埋めることを選択する場合があります。したがって、ガベージが表示されないのはそのためです.char配列は自動的に初期化されました.

于 2012-11-21T16:20:36.563 に答える
1

あなたのプラットフォームでは、ガベージ文字は印刷されません。別のプラットフォームでは、異なる場合があります。

実験として、これを試してください

std::cout << '|' << arr[ index ] << '|' << std::endl;

文字の間に何か表示されるかどうかを確認します||

于 2012-11-21T16:14:15.050 に答える
0

初期化されていない配列の値を使用しようとしているため、未定義の動作が発生しています。特に何かが起こることは期待できません。たぶん、すべての文字が非印刷文字である可能性があります。たぶん、あなたの小さなゲームが好きではないので、何も印刷したくないと判断しただけかもしれません. 何でもあり。

于 2012-11-21T16:17:37.157 に答える