Являются ли эти два метода очистки буфера эквивалентными?

Я размышлял:

они точно так же делают? вызов c = getchar в выражении такой же, как и в цикле do...while?

void clrbuf(void)
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}
void clrbuf(void)
{
    int c;
    do c = getchar(); while (c != '\n' && c != EOF);
}

редактировать: c когда-то был тип char, но люди сказали мне, что int был подходящим типом для него


person Gustavo Duarte    schedule 10.06.2021    source источник
comment
Оба лучше, чем int c;, чтобы различать и справляться с типичными 257 различными ответами от getchar().   -  person chux - Reinstate Monica    schedule 10.06.2021
comment
Ну не только лучше, это обязательно   -  person Eugene Sh.    schedule 10.06.2021
comment
stackoverflow.com/questions/7119470/int-c-getchar   -  person Tim Randall    schedule 10.06.2021
comment
С или С++? Это два разных языка.   -  person Yksisarvinen    schedule 10.06.2021
comment
Оба ошибаются.   -  person 0___________    schedule 10.06.2021
comment
@Yksisarvinen C. Я не знал, что в C++ все может быть по-другому. Я удалю тег. Спасибо   -  person Gustavo Duarte    schedule 10.06.2021
comment
почему, @0___________?   -  person Gustavo Duarte    schedule 10.06.2021
comment
c имеет неправильный тип.   -  person 0___________    schedule 10.06.2021
comment
тогда просто int c вместо char c будет лучше?   -  person Gustavo Duarte    schedule 10.06.2021
comment
Также: while (1) { int c = getchar(); if (c == '\n' || c == EOF) return; } }   -  person ikegami    schedule 10.06.2021


Ответы (1)


Для начала переменная c должна быть объявлена ​​как

int c;

потому что если тип char ведет себя как тип unsigned char, то это условие

c != EOF

всегда будет правдой.

Согласно стандарту C (7.21 ввод/вывод ‹stdio.h›)

ЕОФ

которое расширяется до целочисленного константного выражения с типом int и отрицательным значением, которое возвращается несколькими функциями для указания конца файла, то есть больше никаких входных данных из потока;

Таким образом, если тип char ведет себя как тип unsigned char (это зависит от опций компилятора), то значение, хранящееся в переменной c после преобразования целого числа в тип int, все еще будет неотрицательным значением.

Первый цикл while

while ((c = getchar()) != '\n' && c != EOF);

может быть переписан с использованием оператора запятой, например

while ( c = getchar(), c != '\n' && c != EOF );

фактически состоит из двух частей: выражения присваивания c = getchar() и условия c != '\n' && c != EOF.

Как видите, это эквивалентно оператору do-while.

do c = getchar(); while (c != '\n' && c != EOF);

Однако первый цикл while

while ((c = getchar()) != '\n' && c != EOF);

становится более выразительным и ясным.

person Vlad from Moscow    schedule 10.06.2021
comment
Первый цикл более идиоматичен C (и это помогает сделать его более выразительным и ясным). - person Jonathan Leffler; 10.06.2021