Entendiendo el bucle en C

Estoy teniendo pocas dificultades para descubrir la siguiente pieza de código de bucle simple en C.

int j=20; for(int i=0, j; i<=j ; i++, j--) printf("i = %d and j = %d \n",i,j); 

Imprime la salida como

 i=0 and j=2 i=1 and j=1 

Por qué no comienza con j=20 y más bien imprime j=2 y se detiene después de j=1 .

Pero cuando uso este código

 int j=20; for(int i=0, j=20; i<=j ; i++, j--) printf("i = %d and j = %d \n",i,j); 

Comienza correctamente con

 i=0 and j=20 upto ... i=9 and j= 11 

¿Hay algo que me falta?

Usted está. Al declarar j dentro de la construcción for se crea un nuevo (con ámbito) j, que tiene un valor diferente del exterior. Si no puedes inicializarlo, obtienes cualquier cosa que se encuentre en la memoria cuando se asigna.

Las variables como esta se denominan variables “automáticas” y se asignan en la stack del progtwig. Cuando lo necesite, se asignará más espacio de stack. Cuando están fuera del scope (realmente cuando la función regresa), se limpian haciendo que todos retrocedan.

Cuando se necesita el siguiente bit de almacenamiento automático, sucede lo mismo y luego obtiene el patrón de bits que quede en la stack como su nuevo valor de variables.

Tenga en cuenta que en la primera parte del bucle for ha hecho int i = 0, j . Lo que esto hace es declarar una variable llamada j que tiene un scope local para el bucle for . Por lo tanto, no existe ninguna relación entre la j declarada y definida antes del bucle for y la que usted declara y define dentro del scope del bucle for. La referencia a j dentro del bucle se referirá al bloque que está más adentro, por lo tanto, si se inicializa j a cero, se obtiene la primera salida.

También tenga en cuenta que tiene la suerte de que el valor de j sea ​​cero. Es una variable automática y no se garantiza que sea cero en la definición.

En el siguiente bucle, verá la salida que desea porque, como se mencionó anteriormente, se hace referencia al j definido dentro del bucle for, pero como ha inicializado el valor de j local al bucle for con el mismo valor del j exterior (que no tiene nada). para hacer con la j dentro del bucle for), por lo tanto, obtienes la segunda salida en tu pregunta.

Básicamente esta es la confusión común en la syntax de bucle. Lo que pasa en tu caso es:

 int i=0, j; //create 2 int variables - i (which is initialized to 0) and uninitialized j 

Esto parece similar a for(i,j; i . Sin embargo, lo que hizo es básicamente crear una variable adicional sin inicializar j .

Esta pregunta es sobre el código de una línea. cuando int i=0, j; en una línea, es igual a int i = 0; int j; int i = 0; int j; sin embargo, cuando escribe int i=0, j=20; , te dará un error a menos que j haya definido antes, no es igual a int i = 0; int j = 20; int i = 0; int j = 20;