Asignación y NO precedencias iguales

En la página 17 de The C Programming Language, 2nd Edition, el escritor dice que

La precedencia de != Es mayor que la de =

Así que cuando quiero probarlo, no es así. Este es mi progtwig simple:

 #include  int main() { int inp; while(inp = getchar() != EOF) { putchar(inp); } } 

Lo cual trato de leer una entrada y mostrarla al usuario. Cuando bash eso, no pasa nada y la pantalla está vacía, pero cuando bash esto, todo funciona bien:

 #include  int main() { int inp; while((inp = getchar()) != EOF) { putchar(inp); } } 

¿Qué pasa? Tengo la gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) .

Lo que está sucediendo es exactamente lo que estás diciendo, The precedence of != is higher than that of = .

Eso significa que != une más fuerte que = y

 while(inp = getchar() != EOF) { 

es equivalente a;

 while(inp = (getchar() != EOF)) { 

Eso establecerá inp en el valor bool de la comparación, no en el valor del carácter que está buscando.

Tus dos condiciones son equivalentes a:

 char notEndOfFile = (getchar() != EOF); // notEndOfFile is a boolean if(!(inp = notEndOfFile)) // inp is now a boolean, not the character input break; // break if notEndOfFile is false 

Esto termina en el momento correcto, pero no asigna inp como se desea.

y:

 inp = getchar(); // As desired if(inp != EOF) break // break if inp is EOF 

Termina y asigna inp correctamente.