Оператор запятой - странное чудовище, пока вы не поймете его, и оно не относится только к while
.
Выражение:
exp1, exp2
оценивает exp1
, затем оценивает exp2
и возвращает exp2
.
Вы видите это часто, хотя можете не осознавать:
for (i = j = 0; i < 100; i++, j += 2)
На самом деле вы не используете возвращаемое значение из "i++, j += 2"
, но, тем не менее, оно есть. Оператор запятой оценивает оба бита, чтобы изменить и i
, и j
.
Вы можете использовать его везде, где можно использовать нормальное выражение (например, запятая в вызовах функций не оператор запятой), и это очень полезно при написании компактного исходного кода, если это что ты любишь. Таким образом, это часть семьи, которая позволяет такие вещи, как:
while ((c= getchar()) != EOF) {...}
i = j = k = 0;
и т. Д.
Для вашего конкретного примера:
while (c = getchar(), c != EOF && c != 'x')
происходит следующее:
c = getchar()
выполняется полностью (оператор запятой является точкой последовательности).
c != EOF && c != 'x'
выполнено.
- оператор запятой отбрасывает первое значение (c) и «возвращает» второе.
-
while
использует это возвращаемое значение для управления циклом.