EOF (che in genere è -1) non è un carattere "vero", ma un valore "magico" restituito da getchar() per indicare che è finito lo stream di input. È sostanzialmente il modo che getchar() usa per indicare che ha provato a leggere un carattere, ma erano finiti.
Ctrl-Z, a sua volta, è una combinazione di caratteri che si usa per dire alla finestra della console che l'input è finito.