#include <iostream>
using namespace std;
int main()
{
cout << 1;
while (true);
return 0;
}
Есть такой код. По идее он должен вывести 1 и зависнуть, но он просто зависает, единица не выводится. Перевод строки, cout.flush()
и много чего еще решают эту проблему, но всё же интересно, почему так происходит. printf
точно так же ничего не выводит.
Проблема возникла во время последнего контеста. Я долго висел над B, C прочел за 20 минут до конца и начал лихорадочно кодить. Программа зависала, и я добавил вывод отладочной информации. До конца раунда думал, что програма виснет при считывании последнего элемента массива.
Потому, что вывод буферизован. Соответственно, реальный вывод происходит тогда, когда заканчивается буфер, либо когда дается команда flush (в частности, это делает endl)
А что из этого происходит при использовании printf?И когда заканчивается буфер? Немного непонятно, как это делает сишный printf. В C++ это, наверное, происходит при разрушении объекта.Когда в нем заканчивается место. Я не знаю, честно говоря, дефолтный размер. В деструкторе флаш происходит, естественно
Можешь сделать так:
setbuf(stdout, NULL);
, тогда буферизовать не должно, но думаю при объемном выводе могут возникнуть проблемы со скоростью выполнения.Для debug-вывода лучше использовать небуферизированный cerr.
Он такой же буферизованный, как и другие стандартные потоки вывода.
Конечно же, нет —
cerr
небуферизованный. Стандарт C++03, параграф 27.3.1.5:Таблица 83 « fmtflags effects»:
Однако... век живи — век учись, прошу прощения.
Кажется, что ты всё-таки не прав.