¿Puedo usar la misma variable de contador para un forbucle dentro de un forbucle?
¿O las variables se afectarán entre sí? ¿Debería el siguiente código usar una variable diferente para el segundo ciclo, como j, o está ibien?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}

i, con diferentes alcances. Úselo-Wshadowcon GCC para que estos problemas se informen automáticamente.-Wshadowno esté incluido en-Wall.-Wshadowadvierte sobre el sombreado de variables globales, lo que fácilmente podría resultar molesto en proyectos más grandes.-Wextrano incluye-Wshadow. Supongo que es bastante común en algunos proyectos, o algunos desarrolladores de gcc adoran el sombreado como estilo de codificación, para justificar que se les deje de lado de esta manera.-Wshadowtiene una horrenda tasa de falsos positivos, lo que lo vuelve completamente inútil. El alcance existe por una razón, y el sombreado no es a priori problemático. Ahora-Wshadow-local(nota: no-Wshadow=local) es muy diferente. Pero desafortunadamente GCC se ha negado hasta ahora a incluirlo en el tronco (aunque parece haber bifurcaciones de GCC que lo incluyen).Respuestas:
Puede utilizar el mismo nombre (identificador). Será un objeto diferente. No se afectarán entre sí. Dentro del bucle interno, no hay forma de hacer referencia al objeto utilizado en el bucle externo (a menos que haga disposiciones especiales para eso, como al proporcionarle un puntero).
Por lo general, este es un mal estilo, es propenso a la confusión y debe evitarse.
Los objetos son diferentes solo si el interior se define por separado, como con el
int ique ha mostrado. Si se usa el mismo nombre sin definir un nuevo objeto, los bucles usarán el mismo objeto e interferirán entre sí.fuente
Primero, esto es absolutamente legal: el código se compilará y ejecutará, repitiendo el cuerpo del bucle anidado 10 × 10 = 100 veces. El contador de bucle
identro del bucle anidado ocultará el contador del bucle exterior, por lo que los dos contadores se incrementarán independientemente uno del otro.Dado que el exterior
iestá oculto, el código dentro del cuerpo del ciclo anidado tendría acceso solo al valor deliciclo anidado, noidesde el ciclo exterior. En situaciones en las que el bucle anidado no necesita acceso al exterioridicho código podría ser perfectamente justificable. Sin embargo, es probable que esto cree más confusión en sus lectores, por lo que es una buena idea evitar escribir ese código para evitar "responsabilidades de mantenimiento".Nota: A pesar de que las variables de control de ambos bucles tienen el mismo identificador
i, siguen siendo dos variables independientes, es decir, que está no utiliza 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:Ahora ambos bucles usan la misma variable. Sin embargo, lleva un tiempo averiguar qué hace este código sin compilarlo ( demostración );
fuente
intbucle for interno, es decir, usar la misma variable de contador, hará que el bucle externo solo se ejecute una vez, ya que el bucle interno se irái == 10. Esto es trivial, peroUsted puede. Pero debe tener en cuenta el alcance de la
is. si llamamos al exterioriconi_1y al interioriconi_2, el alcance de lais es el siguiente:Debe notar que no se afectan entre sí, y solo su alcance de definición es diferente.
fuente
Eso es completamente posible, pero tenga en cuenta que no podrá abordar la primera i declarada
en el segundo ciclo dentro del segundo ciclo secundario
si necesita ajustar u obtener el valor de la primera i, use j en el segundo ciclo
y si eres lo suficientemente creativo, puedes hacer ambos en un ciclo
fuente
Sí, puede usar el mismo nombre de variable de contador para un
forbucle interno que para elforbucle externo .Desde el bucle for :
El alcance de loop_statement está anidado dentro del alcance de init_clause .
De C Standards # 6.8.5p5 Declaraciones de iteración [el énfasis es mío]
De C Standards # 6.2.1p4 Alcances de identificadores [énfasis mío]
fuente
Desde la perspectiva del código / compilador, esto sería perfectamente válido y legal. El
int ideclarado en elfor(int i = 0; i < 10; i++)bucle interno está en un alcance nuevo y más pequeño, de modo que la declaración ensombrece la declaración deint ien el bucle externo (o, con otras palabras: en el alcance interno todos los accesos a la variableivan alint ideclarado en el alcance interno, dejandoint iintacto el en el alcance 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.
fuente
Sí, puedes usarlo, pero es bastante confuso. Lo más importante es el alcance de la variable local dentro del ciclo. En cuanto a si una variable se declara dentro de una función, el alcance de esa variable es esa función.
De manera similar, en el caso de los bucles, la variable declarada dentro del bucle interno tiene un alcance diferente y el bucle externo declarado de la variable tiene un alcance diferente.
El mejor enfoque es utilizar diferentes variables para bucles internos y externos.
fuente
Sí, definitivamente puedes usar la misma variable de nombre.
Las variables de programación C se pueden declarar en tres lugares:
Variables locales: -Dentro de una función o un bloque.
Variables globales: -Fuera de todas las funciones.
Parámetros formales: -En los parámetros de la función.
Pero en tu caso
i scopetendrás que preocuparte debajo de cosasNota: sería una buena práctica utilizar diferentes variables para los bucles internos y externos
fuente
Sí, y lo que es más interesante, puede reutilizar un nombre de variable cada vez que abre un conjunto de llaves. Esto suele ser útil al insertar un código de diagnóstico. Escriba una llave abierta '{' seguida de una declaración y uso de variables, luego cierre la llave y las variables desaparecerán. Esto garantiza que no interferirá con nada en el cuerpo principal mientras conserva la ventaja de las variables, clases y métodos declarados fuera de las llaves.
fuente
Regla de alcance: una variable declarada en una instrucción for solo se puede usar en esa instrucción y el cuerpo del bucle.
Si en su código ha definido varias instancias de i en bucles internos, cada instancia ocupará su propio espacio de memoria. Así que no hay nada de qué preocuparse por los resultados de todos modos, sería lo mismo.
Pero no se recomienda utilizar el mismo nombre de variable, ya que es difícil de entender y luego se convierte en código no mantenible.
fuente
La parte importante es que el parámetro de bucle interno contiene
int i. Debido a queise redefine de esta manera, las dos variables no se afectan entre sí; sus alcances son diferentes. Aquí hay dos ejemplos para mostrar esto:Tenga en cuenta que el código anterior incluye
int ien el parámetro de bucle interno y el código siguiente solo incluyei.fuente
Bueno, puedes hacer esto sin que tus scripts tengan problemas, pero debes evitar esa estructura. Suele generar confusión
fuente