expresión separada por comas en el bucle while en C

Nunca vi tal afirmación antes.

while(printf("> "), fgets(str, 100, stdin), !feof(stdin)) { .. .. } 

Leí en línea, que la condición para salir del bucle while es la más a la derecha [! Feof (stdin)]. Entonces, ¿cuál es el uso de la sentencia while mientras que en lugar de

 while(!feof(stdin)) { printf("> "); fgets(str, 100, stdin); ... ... } 

Además, si bien la instrucción toma una expresión, ¿entonces 1,1,1 es una expresión válida en C?

Los dos bucles dados no tienen el mismo significado. Al utilizar el operador de coma de esa manera, el autor pudo especificar el código que debe ejecutarse en cada iteración, incluso si el bucle nunca se ingresa. Es más como un bucle do ... while () , o algo como lo siguiente:

  printf("> "); fgets(str, 100, stdin); while(!feof(stdin)) { .. .. printf("> "); fgets(str, 100, stdin); } 

El operador de coma se considera mejor como, bueno, un operador. Al igual que + es un operador, de modo que 2 + 3 es una expresión (que resulta en un valor de 5 ), también es un operador y, por lo tanto 0, 1 es una expresión válida (que resulta en un resultado). Valor de 1 , ya que ese fue el último operando).

Su modificación propuesta no es equivalente. Esto es:

 while (1) { printf("> "); fgets(str, 100, stdin); if (feof(stdin)) { break; } ... ... } 

Yo sugeriría en cambio dividir el trabajo en una función:

 int get_input(char* buffer, int size) { printf("> "); fgets(buffer, size, stdin); return !feof(stdin); } while (get_input(str, 100)) { ... ... } 

Su segundo ejemplo tiene un comportamiento diferente al primero y tiene un error.

Si la línea de código:

 fgets(str, 100, stdin); 

falla porque fue una lectura al final del archivo, luego se ejecutará el rest del bloque.

En el primer conjunto de códigos, la prueba feof() produce después de los fgets() que causan la condición EOF, por lo que el bloque while() no se ejecutará.

Como fgets() devuelve NULL si ha alcanzado EOF (y no ha leído ningún dato en el búfer), podría codificar el bucle como:

 while (fgets(str, 100, stdin)) { printf("> "); // ... } 

que sigue siendo un comportamiento ligeramente diferente (habrá un “>” menos impreso). Si eso fuera importante, pondría una instancia extra de ese printf() antes del bucle.

En general, dado que tiende a causar confusión, evitaría el operador de coma, excepto cuando es realmente necesario o donde no causa confusión. Por ejemplo, a veces se usa for cláusulas de bucle de una manera no confusa para permitir que se actualicen varias variables en cada iteración de bucle.

 while(printf("> "), fgets(str, 100, stdin), !feof(stdin)) { .. .. } 

Las comas dentro de un tiempo se comportan más así:

 int feof_wrapper(FILE * stream) { printf("> "); fgets(str, 100, stream); return feof(stream); } while(!feof_wrapper(stdin)) { .. .. }