2016-02-21 3 views
0

Моя проблема заключается в следующем:putchar() и GetChar() цикл объяснение

int c; 
c = getchar(); 
while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
} 

while((c = getchar()) != EOF) { 
    putchar(c); 
} 

Эти два делает то же самое. Мой вопрос в том, как они работают? И почему они оба дают одинаковый результат?

Насколько я понимаю, это позволяет взять первый пример в качестве примера, он читает один символ, его не EOF-> входите в putchar (printchar на экране), а затем переходите в другой символ. Однако, скажем, я ввожу что-то вроде «Привет», он выведет Привет, как и почему? Почему он не просто выводит 5x H -> HHHHH?

+1

SO не репетиторский сайт. Вам нужна книга C или учебник. – Olaf

+0

@ Ludvig Westerdahl Они работают так, как они писали.:) –

+1

Если вы внимательно посмотрите на первый пример, вы увидите, что 'c' оценивается перед циклом' while' и в конце. Во втором примере 'c' оценивается как часть выражения цикла while. Он похож на идиоматический 'if ((a + = 2) == 3) ...' в отличие от более простого 'a + = 2; if (a == 3) ... ' –

ответ

0

putchar - это функция на языке программирования C, которая записывает один символ в стандартный выходной поток, стандартный вывод.

Функция библиотеки C int getchar(void) получает символ (неподписанный символ) из stdin. Это эквивалентно getc с stdin.

Надеюсь, что это поможет.

+0

Но почему он сохраняет более 1 символа в буфере каждый цикл? – Lurr

+0

Я не уверен, в чем ваш вопрос? Не могли бы вы подробно объяснить свой вопрос? –

0

Просто.

Вы согласны с тем, что

while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
} 

эквивалентно

while ((c = getchar()) != EOF) { 
    putchar(c); 
} 

для каждого вызова от второго до конца, потому что это не имеет значения, если вы назначаете новые значения c на конец цикла, а затем comapre до EOF или сделать это за один вызов в состоянии остановки цикла.

Но это для всех вызовов, кроме первого. Если вы оставили

int c; 
c = getchar(); 

до цикла, чем для первого звонка, вы бы оценили c = getchar() дважды. Таким образом, мы должны удалить это, и мы остались с:

while((c = getchar()) != EOF) { 
    putchar(c); 
} 
0

Первый цикл

c = getchar(); 
while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
} 

присваивает то, что в stdin внутри тела петли, а второй контур

while((c = getchar()) != EOF) { 
    putchar(c); 
} 

вы объединить присваивание с помощью сравнения внутри логического выражения цикла. Это связано с порядком оценки в C и на многих других языках (вы можете сделать то же самое и на Java). Таким образом, вы получаете значение c с первого термина (который является выражением в этом случае), а затем сравнивайте его с EOF.

Btw Я хотел бы изменить первую петлю на

do { 
    putchar(c); 
    c = getchar(); 
} while (c != EOF); 

Таким образом, вы не должны заранее присвоить значение c и идти прямо к тому, что putchar() поставляет.

Смежные вопросы