Ваш второй пример имеет поведение, отличное от первого, и содержит ошибку.
Если строка кода:
fgets(str, 100, stdin);
терпит неудачу, потому что это было чтение в конце файла, тогда остальная часть блока будет выполнена.
В первом наборе кода тест feof()
выполняется после fgets()
, который вызывает условие EOF, поэтому блок while()
не будет выполнен.
Поскольку fgets()
возвращает NULL, если он достиг EOF (и не считал данные в буфер), я мог бы закодировать цикл как:
while (fgets(str, 100, stdin)) {
printf("> ");
// ...
}
, который по-прежнему немного отличается по поведению (будет напечатано на один ">" меньше). Если бы это было важно, я бы поставил дополнительный экземпляр этого printf()
перед циклом.
В общем, поскольку это имеет тенденцию вызывать путаницу, я бы избегал оператора запятой, за исключением случаев, когда он действительно, действительно необходим или где он не вызовет путаницы. Например, он иногда используется в предложениях цикла for
не путающим образом, чтобы позволить нескольким переменным обновляться на каждой итерации цикла.