Ayúdame a entender cómo funciona el programa.
Lo tomo del libro de Steven Pratt “Program language C” que encuentro en la página № 289 ejercicio №6.
Es un programa, su código aquí:
#include <stdio.h> #include <stdlib.h> int main(void) { int i = 0; while (i<3) { switch (i++) { case 0 : printf ("fat "); case 1 : printf ("hat "); case 2 : printf ("cat "); default : printf ("Oh no "); } putchar('\n'); } return 0; }Por favor corrígeme si no estoy en lo cierto. En este momento, me gustaría explicar cómo funciona. Primero trabajar la función “mientras” tres veces.
La variable "i" tiene el primer valor de tiempo 0. Luego, durante el trabajo de la función "mientras", la variable debe agregarse tres veces tres veces.
Como resultado del trabajo del programa, obtuve este resultado:
fat hat cat oh no hat cat oh no cat oh noPero no puedo entender cómo obtuve tal resultado. Estoy acostumbrado a IDE CodeBlock y mi compilador funciona bien. Cambié el código del programa muchas veces para entender cómo funcionaba. Cambié el operatore "caso".
En este momento cambié el código del programa así que:
#include <stdio.h> #include <stdlib.h> int main(void) { int i = 0; while (i<2) { switch (i++) { case 1 : printf ("fat "); case 2 : printf ("hat "); case 3 : printf ("cat "); default : printf ("Oh no "); } putchar('\n'); } return 0; }Después de obtener tal resultado:
oh no fat hat cat oh noPero no puedo entender por qué el programa funciona así. En mi opinión, el programa debe dar tal resultado:
fat Oh noCreo que el trabajo de resultado o programa debe ser solo así. ¿Por qué el programa funciona así?
Su código debería verse así:
#include <stdio.h> #include <stdlib.h> int main(void) { int i = 0; while (i<2) { switch (i++) { case 1 : printf ("fat "); break; case 2 : printf ("hat "); break; case 3 : printf ("cat "); break; default : printf ("Oh no "); break; } putchar('\n'); } return 0; }"¿Por qué el programa funciona así?"
En resumen, se debe a la forma en que funciona una variable posterior al incremento y a que la implementación del libro de la declaración de switch , aunque legal, no es típica, ya que no limita el flujo de ejecución a un caso por iteración.
Primero, la forma de la declaración de switch del libro no es típica. Esperaría que parte del texto en esa sección del libro eventualmente incluya el uso de la instrucción break colocada entre cada una de las líneas de case
En el ejemplo original del libro, cuando se llama al switch en el primer bucle, i == 0 , lo que da como resultado este flujo de ejecución:
starts at `case 0:` then increments `i` to `1`, then outputs `fat`, falls through to `case 1:` outputs `hat`, falls through to `case 2:` outputs `cat`, falls through to `default` outputs `Oh no` La segunda iteración del ciclo while , con i == 1 , nuevamente incrementado posteriormente , comienza en el segundo case
starts at `case 1:` `i` is incremented to `2`, then outputs `hat`, falls through to `case 2:` outputs `cat`, falls through to `default` outputs `Oh no` Con i == 2 la tercera iteración sigue:
starts at `case 2:` i is incremented to `3` outputs `cat`, falls through to `default` outputs `Oh no` En su código modificado, se elimina el case 0 . Debido a que i se inicializa a 0 , el flujo de ejecución salta inmediatamente al caso default . Y puedes seguir al resto.
Tenga en cuenta que en el texto de su libro probablemente aprenderá que la declaración de switch se usa comúnmente junto con la declaración de break , lo que garantiza que solo se ejecute un case por swtich :
int main(void) { int i = 0; while (i<3) { switch (i++) { case 0 : printf ("fat "); break;// execution flow jumps directly to closing } case 1 : printf ("hat "); break;// execution flow jumps directly to closing } case 2 : printf ("cat "); break;// execution flow jumps directly to closing } default : printf ("Oh no "); } putchar('\n'); } getchar(); return 0; }