Первый код, который вы написали:
while( scanf("%d", &n) ) { ... }
будет работать нормально , если scanf
вернет true для успеха и false для сбоя. Но это не то, что scanf
возвращает.
scanf
фактически возвращает количество успешно сопоставленных элементов. Или возвращает 0, если ни один не был найден. Или (и это ключевой момент) возвращает отрицательное значение EOF
(обычно -1), если достигнут конец файла, например, когда вы набрали control-D.
Первый код, который вы написали, зацикливается, пока scanf
возвращает ненулевое значение. Вот почему это зациклено навсегда.
Второй код, который вы написали:
while( scanf("%d", &n) == 1 ) { ... }
зацикливается до тех пор, пока scanf
успешно соответствует одному пункту, который он попросил вас. Это правильный способ сделать это, и именно поэтому это сработало.