3

重複の可能性:
NULLが送信された後、std::coutの出力が完全に消えるのはなぜですか

試してみると、次のようになります。

 std::cout << NULL << endl;
 std::cout << "hell" << endl;

何も出力せず、C++IOは後続のすべての出力で機能しなくなります。

しかし、C stdioでは正常に動作します:

 printf("%s\n", NULL);
 printf("%s\n", "hell"); 

(ヌル)

地獄

C ++ IOが同じことをできない理由はありますか?

(コメントに応じて編集)わかりました。明確にするために、NULLには型があります。たとえばconst char *

const char* getxxx();  // may return NULL, 
cout << getxxx();      // won't work if NULL returned
4

2 に答える 2

14

は?coutあなたが実行したという理由だけで失敗する理由がわかりません

std::cout << 0 << std::endl;

出力する必要があります0\n。そして、そうです。話の終わり。

(混乱する場合は、C++ のことを知っておいてください#define NULL (0)。)

あなたが書いた場合:

T* p = 0;
std::cout << p << std::endl;

次に、アドレスが表示されます0(通常は 16 進数で、ポインターのサイズに合わせてパディングされます。これは、ポインターを確認するための推奨される方法であるためです)。

(ところで、これは NULL の C 定義を使用して得られる動作です#define NULL ((void*)0)。)

あなたが書く場合のみ

char* p = 0;
std::cout << p << std::endl;

何か困っていますか。今、あなたは電話しています

template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, const char* s);

標準(セクション27.7.3.6.4)は次のように述べています。

Requires : snull ポインターであってはなりません。

null ポインターを渡した場合は、規則 17.6.4.9 が適用され、次のように規定されています。

次のそれぞれは、特に明記されていない限り、C++ 標準ライブラリで定義されている関数のすべての引数に適用されます。* 関数の引数に無効な値 (関数のドメイン外の値や、意図された使用に対して無効なポインターなど) がある場合、動作は未定義です。

だからあなたは「未定義の振る舞い」の土地にいます。failbitが設定され、プログラムが続行されるという保証はありません。


printf動作は実際には のタイプに依存しないことに注意してくださいNULL"%s"文字列 (NUL で終了する文字シーケンスへのポインター) として扱われるようになったのは、フォーマット文字列です。

于 2013-01-25T17:15:04.577 に答える
2

printf("%s", str)文字列を処理する必要がないNULLので、渡すNULL ことでトラブルを求めています。

IOStreamsと意味的に同等のステートメントは次のとおりです。

std::cout << static_cast<char const*>(NULL);

また、これはNULL文字列を処理するためにも必要ありません。

于 2013-01-25T17:24:43.267 に答える