Почему эта программа на C ничего не печатает? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий код:

int main()
{
   printf("hello world");
   while(1);
}

Должен ли быть напечатан привет мир?Если да, то ПОЧЕМУ?Если нет, ПОЧЕМУ?Я использую GCC на машине Linux для компиляции кода.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

В ходе обычных событий сообщение не будет напечатано - по крайней мере, на большинстве Unix-подобных платформ.Выходной буферизацией по умолчанию является (обычно) линейная буферизация, когда стандартный вывод является «интерактивным устройством» (стандартный жаргон для «терминала»).Поскольку вы не печатали новую строку, нет строки, которая должна быть очищена, поэтому вывод остается в буферах программы.Когда вы прерываете его, вывод не сбрасывается.

Только если вы установите для вывода значение «без буферизации», вы увидите вывод или если вы введете явное fflush(stdout) или fflush(0) перед вводомцикл, или вы делаете разумную вещь и добавляете новую строку в строку, которая печатается в первую очередь.

setvbuf(stdout, NULL, _IONBF, 0);

(Полная буферизация, например, когда вы передаете вывод в другую программу, в значительной степени гарантирует вамтоже не увидит вывод.)

0 голосов
/ 18 декабря 2018

Мы не можем сказать.

Стандартный буфер вывода может быть очищен, но он также не может быть очищен.

Другими словами, "привет мир" будет сохраненв стандартном выходном буфере, когда выполняется это printf("hello world");.

Тогда из-за while(1); мы пойдем в бесконечный цикл.

В этот момент мы не можемопределить, будет ли очищен стандартный выходной буфер или нет.Например, в этом Live-демо этого не происходит, что, скорее всего, произойдет, но в целом это не гарантировано.

Обычно я быдобавьте новую строку, чтобы убедиться, что сообщение напечатано.Подробнее читайте в Почему printf не сбрасывается после вызова, если в строке форматирования нет новой строки?

Другой способ сделать это, выглядит так:

#include <stdio.h>
int main(){
  printf("hello world");
  fflush(stdout);
  while(1);
}

заставит стандартный буфер вывода сам себя очистить и направить все, что в нем хранится, на стандартный вывод (обычно ваш экран).

Как сказал @hyde, вы могли бы стимулировать это поведение с помощью своего исходного кода, имеяgdb очистка буфера для вас, например.Подробнее в Как отменить буфер стандартного запуска двоичного файла без stdbuf и подобных инструментов .


Это может быть гипотетическим сценарием, но из этого следует извлечь урок изпри отладке многие люди используют printf() s, чтобы точно определить, где, например, происходит сбой их программы.

Не очищать буфер вывода может привести к ложным предположениям, так как программист может подумать, что программа аварийно завершилась до этого printf("here");, но это может быть не так по причинам, рассмотренным выше.

Другими словами, может быть верно, что «здесь» не печатается в стандартном выводе (например, на экране), но это нене означает, что выполнение нашей программы не достигло этого printf().

...