Возможный дубликат:
Почему вывод std :: cout полностью исчезает после отправки на него значения NULL
Кажется, если вы попробуете:
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
А? Я не вижу причин, почему cout
должен потерпеть неудачу просто потому, что вы казнили
std::cout << 0 << std::endl;
Должен вывести 0\n
, А также оно делает. Конец истории.
(Если вы запутались, пожалуйста, знайте, что в C ++, #define NULL (0)
.)
Если вы написали:
T* p = 0;
std::cout << p << std::endl;
тогда он будет отображать адрес 0
, (обычно в шестнадцатеричном и дополненном до размера указателя, так как это предпочтительный способ просмотра указателей).
(Это, кстати, поведение, которое вы получите, используя определение C NULL, которое #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) гласит:
требует:
s
не должен быть нулевым указателем.
Когда вы передаете нулевой указатель, применяется правило 17.6.4.9, которое гласит:
Каждое из следующих условий применимо ко всем аргументам функций, определенных в стандартной библиотеке C ++, если явно не указано иное.
* Если аргумент функции имеет недопустимое значение (например, значение вне домена функции или указатель, недопустимый для ее предполагаемого использования), поведение не определено.
Таким образом, вы находитесь в стране «неопределенного поведения». Там нет никакой гарантии, что failbit
устанавливается и программа продолжается.
Обратите внимание, что printf
поведение на самом деле не зависит от типа NULL
, Это строка формата "%s"
это вызвало обработку в виде строки (указатель на NUL-оканчивающуюся последовательность символов).
printf("%s", str)
не требуется обрабатывать NULL
струны, так что мимоходом NULL
ты напрашиваешься на неприятности.
Семантически эквивалентный оператор с IOStreams:
std::cout << static_cast<char const*>(NULL);
И это не обязательно обрабатывать NULL
Строка либо.