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.