Trzeba ten warunek rozbić na mniejsze fragmenty. Kluczowym elementem, który trzeba zrozumieć jest to, jak zachowuje się przypisanie wewnątrz warunku.
Masz tam taki kod:
ch = getchar()
Jak nietrudno się domyślić, przypisuje on do zmiennej ch to, co zwróci funkcja getchar(). Lecz teraz trzeba sobie zadać pytanie - co taki zapis robi w warunku i jak on się tam zachowuje. Można je sformułować inaczej - jaką wartość zwraca poniższy kod: (czyli jaka wartość zostanie "podstawiona" w to miejsce w momencie wykonania kodu).
(ch = getchar())
Odpowiedź jest prosta - w to miejsce zostanie podstawiona nowa wartość zmiennej ch, czyli ta wartość którą zwróciła funkcja getchar().
Dysponując już taką wiedzą, można zrozumieć o co chodzi w tym zapisie. Po prostu w jednym miejscu zapisujemy do zmiennej ch nową wartość i sprawdzamy, czy wartość ta nie jest przypadkiem różna od znaku nowej linii i tak dalej… całego warunku już nie będę tłumaczył. Kod ten pozwala po prostu skrócić zapis (choć może to komplikować zrozumienie kodu - ja osobiście starałbym się takich rzeczy wewnątrz warunku nie robić).
Dodatkowo za pętlą dano średnik, co jest równoznaczne z tym, że ta pętla ma nie robić nic, dopóki znak jest różny od znaku nowej linii lub EOF.
Jeżeli jestem jeszcze w stanie rozsądnie myśleć o tej godzinie, to alternatywny zapis tej pętli będzie taki:
do {
ch = getchar();
} while (ch != '\n' && ch != EOF);
Mam nadzieję, że pomogłem.