fgetc, verificando EOF

No livroProgramação do Sistema Linux Eu li alguns assim:

fgetc retorna o caractere lido comounsigned char elenco para umint ouEOF no final do arquivo ou erro. Um erro comum usandofgetc é:

char c;
if ((c = fgetc()) != EOF) {...}

A versão correta deste código é:

int c;
if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }

Então, por que não posso lançar um valor de retorno parachar antes de comparar comEOF? Por que eu tenho que compararEOF exatamente comint? ComoEOF definido como-1, normalmente não é lançado parachar?
Existem plataformas / compiladores onde isso não é verdade?

questionAnswers(2)

yourAnswerToTheQuestion