Существует только три случая, когда вывод отправляется из буфера на экран:
1: отправляется, когда буфер переполняется.
2: при переводе строкивстречается символ (в терминале с линейной буферизацией).
3: при приближающемся вводе.
В отличие от того, что было сказано @ Mogzol вкомментарии, если бы здесь возникла какая-то проблема с буферизацией, этот простой цикл не сработал бы:
for(i=0;i<47966;i++)
{
printf(" %d",i);
}
В этом пошаговом примере что-то еще происходит:
СЛУЧАЙ 1:
#include<stdio.h>
int main(void)
{
unsigned long int i=47966ull,k;
for(k=0;k<i;++k)
{
}
return 0;
}
Этот код занимает почти незначительное время для завершения, хотя цикл ничего не делает.
СЛУЧАЙ 2:
#include<stdio.h>
int main(void)
{
unsigned long int i=47966,k;
for(i=0;i<47966;i++)
for(k=0;k<47966;++k)
{
}
return 0;
}
Приведенный выше код почти занимает 9,1 секунд (не считая ошибки) для выполнения бездействия.
CASE 3:
#include<stdio.h>
int main(void)
{
unsigned long int i=47966,k,z;
for(i=0;i<47966;i++)
{
printf(" %d",i);
for(k=0;k<47966;++k)
{
}
}
return 0;
}
Это, безусловно, работает, начиная с case 1 , мы можем сказать, что для каждого i
waВремя печати меньше, следовательно, цифры печатаются в ближайшее время.
Даже для печати этого простого базового кода (вы можете попробовать это) требуется огромное количество времени:
//WRITTEN TO CHECK WHEN DOES THE FIRST OVERFLOW OCCURS
#include<stdio.h>
int main(void)
{
unsigned long int i=47966,k,z;
for(i=0;i<47966;i++)
{
printf(" %d",i);
for(k=0;k<47966;++k)
{
printf("-");
}
}
return 0;
}
Inв вашем случае это большое время ожидания перед первым переполнением буфера.Я упомянул переполнение, потому что:
- Даже если ваш терминал настроен на линейный буфер, нет
\n
для его очистки. - Нет входящего ввода.
SOURCE (S): - Что такое с printf (), отправляющим вывод в буфер?
ПРИМЕЧАНИЕ. Игнорировать часть unsigned long
- itбыла только из какой-то старой программы, которую я не потрудился изменить.
MAJOR -> Если вы используете fflush(stdout)
во внутреннем цикле, вы обнаружите, что это простопроблема синхронизации - отнимает много времени для буферизации всех их от 0 до 47966 , поскольку в буфере будет только одно число между двумя последовательными сбросами.