Я уже закрыл эту тему в своем сообщении выше.
Это Вам только кажется.
Кстати, не нужно этот 'rand' городить. Для бесконечного цикла достаточно 'while(true);'.
Нет, не достаточно. В языках С и С++ бесконечные циклы допускаются только в том случае, если они имеют наблюдаемое поведение (observable behavior, т.е. ввод-вывод, доступ к volatile объектам, доступ к atomic объектам и т.п). Если у вас в программе есть бесконечный цикл без наблюдаемого поведения, поведение вашей программы не определено.
То есть никакого
while(true); ни в С, ни в С++ не допускается.
clang в таких случаях ведет себя весьма смело: он просто выкинет из программы ваш цикл.
https://godbolt.org/z/Y3v5ds4v3Мой
while с
rand(), честно говоря, не лучше )) Но по крайней мере тот факт, что
rand() меняет глобальное состояние, дает надежду на успех. Его
clang выкинуть не осмеливается.
Коррекция: возможно я не прав. Вышесказанное относится только к циклам с неконстантным управляющим выражением? Надо разобраться поглубже...
Ага, в С есть эта оговорка про константность управляющего выражения. В С++ такой оговорки нет.
Да, действительно, при наличии символа "\n" происходит вывод на консоль.
Именно.
А теперь вот так попробуйте.
Вариант 1:
#include <iostream>
int main()
{
std::cout << "Hello World\n";
while(true);
}
и вариант 2:
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
while(true);
}
Соберите как 'g++ tst.cpp' и запустите как './a.out | tee res.txt'.
И опять же почувствуйте разницу.
Это все очень интересно, но как вы сами, наверное, догадываетесь это все - наведенные эффекты, вызванные перенаправлением стандартного выходного потока. Стандартный выходной поток приложения
a.out в такой ситуации не связан с консолью и, поэтому, очевидно работает в режиме полной буферизации. Того же эффекта вы достигнете и через
./a.out | cat.
Меня не удивит, если в реализации стандартной библиотеки GCC стоит банальный
if, выбирающий режим буферизации на основе анализа результата
isatty(1).