while - ¿Puede un bucle 'for' dentro de un bucle 'for' usar el mismo nombre de variable de contador?




tipos de bucles en programacion (8)

¿Puedo usar la misma variable de contador para un bucle for dentro de un bucle for ?

¿O se afectarán las variables entre sí? ¿Debería el siguiente código usar una variable diferente para el segundo bucle, como j , o i bien?

for(int i = 0; i < 10; i++)
{
  for(int i = 0; i < 10; i++)
  {
  }
}

Bueno, puedes hacer esto sin que tus scripts tengan un problema, pero debes evitar esa estructura. Suele llevar a confusión.


Desde la perspectiva del código / compilador, esto sería una cosa perfectamente válida y legal de hacer. El int i declarado en el bucle interno for(int i = 0; i < 10; i++) está en un ámbito nuevo y más pequeño, por lo que la declaración sombrea la declaración de int i en el bucle externo (o, con otras palabras: In En el ámbito interno, todos los accesos a la variable i van al int i declarado en el ámbito interno, dejando int i en el ámbito externo).

Dicho esto, desde la perspectiva de la calidad del código, esto es absolutamente horrible. Es difícil de leer, difícil de entender y fácil de malinterpretar. No lo hagas


La parte importante es que el parámetro del bucle interno contiene int i . Debido a que i se redefine de esta manera, las dos variables no se afectan entre sí; Sus alcances son diferentes. Aquí hay dos ejemplos para mostrar esto:

for(int i = 0; i < 10; i++) // This code will print "Test" 100 times
{
 for(int i = 0; i < 10; i++)
 {
  puts("Test");
 }
}

Tenga en cuenta que el código anterior incluye int i en el parámetro de bucle interno, y el código siguiente solo incluye i .

for(int i = 0; i < 10; i++) // This code will print "Test" 10 times
{
 for(i = 0; i < 10; i++)
 {
  puts("Test");
 }
}

Primero, esto es absolutamente legal: el código se compilará y se ejecutará, repitiendo el cuerpo del bucle anidado 10 × 10 = 100 veces. El contador de bucle i dentro del bucle anidado ocultará el contador del bucle externo, de modo que los dos contadores se incrementarán independientemente uno del otro.

Como la i externa está oculta, el código dentro del cuerpo del bucle anidado solo tendría acceso al valor de i del bucle anidado, no i desde el bucle externo. En situaciones en las que el bucle anidado no necesita acceder al código externo, dicho código podría ser perfectamente justificable. Sin embargo, es probable que esto genere más confusión en sus lectores, por lo que es una buena idea evitar escribir dicho código para evitar "responsabilidades de mantenimiento".

Nota: Aunque las variables de contador de ambos bucles tienen el mismo identificador i , siguen siendo dos variables independientes, es decir, no está utilizando la misma variable en ambos bucles. También es posible usar la misma variable en ambos bucles, pero el código sería difícil de leer. Aquí hay un ejemplo:

for (int i = 1 ; i < 100 ; i++) {
    for ( ; i % 10 != 0 ; i++) {
        printf("%02d ", i);
    }
    printf("%d\n", i);
}

Ahora ambos bucles usan la misma variable. Sin embargo, toma un tiempo averiguar qué hace este código sin compilarlo ( demo );


Sí, definitivamente puedes usar la misma variable de nombre.

Las variables de programación en C se pueden declarar en tres lugares:
Variables locales: -Dentro de una función o un bloque.
Variables globales: -Salidas de todas las funciones.
Parámetros formales: -En los parámetros de la función.

Pero en tu caso el i scope tendré que ocuparme de las cosas.

for(int i = 0; i < 10; i++)
{
     // i means 1st for loop variable
     for(int i = 0; i < 10; i++)
     {
        // but here i means 2nd for loop  variable
     }
     //interesting thing here i means 1st for loop variable
}

Nota: sería una buena práctica utilizar diferentes variables para los bucles internos y externos.


Sí, e incluso más interesante, puede reutilizar un nombre de variable cada vez que abra un conjunto de llaves. Esto suele ser útil cuando se inserta un código de diagnóstico. Escriba una llave abierta '{' seguida de declaración y uso de variables, luego cierre la llave y las variables desaparecen. Esto garantiza que no interferirá con nada en el cuerpo principal y al mismo tiempo conservará la ventaja de las variables, clases y métodos declarados fuera de las llaves.


Sí, puedes usarlo pero es bastante confuso. Lo más importante es el alcance de la variable local dentro del bucle. Hasta donde se declara una variable dentro de una función, el alcance de esa variable es esa función.

int a = 5;
// scope of a that has value 5
int func(){
    int a = 10;
   // scope of a that has value 10
}
// scope of a that has value 5

De manera similar, el caso con los bucles, la variable declarada dentro del bucle interno tiene un alcance diferente y la variable el bucle externo declarado tiene un alcance diferente.

for(int i = 0; i < 10; i++){
    // In first iteration, value of i is 0

    for(int i = 1; i < 10; i++){
        // In first iteration, value of i is 1
    }
    // In first iteration, value of i is 0
}

El mejor enfoque es utilizar diferentes variables para los bucles internos y externos.

for(int i = 0; i < 10; i++){

    for(int j = 1; j < 10; j++){

    }

}

Usted puede. Pero debes ser consciente del alcance de los i s. Si llamamos la i externa con i_1 y la i interna con i_2 , el alcance de la i es el siguiente:

for(int i = 0; i < 10; i++)
{
     // i means i_1
     for(int i = 0; i < 10; i++)
     {
        // i means i_2
     }
     // i means i_1
}

Debes notar que no se afectan entre sí, y solo su alcance de definición es diferente.







nested