Для начала переменная 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
int c;
, чтобы различать и справляться с типичными 257 различными ответами отgetchar()
. - person chux - Reinstate Monica   schedule 10.06.2021c
имеет неправильный тип. - person 0___________   schedule 10.06.2021int c
вместоchar c
будет лучше? - person Gustavo Duarte   schedule 10.06.2021while (1) { int c = getchar(); if (c == '\n' || c == EOF) return; } }
- person ikegami   schedule 10.06.2021