¿Puedo usar la misma variable de contador para un for
bucle dentro de un for
bucle?
¿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á i
bien?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
i
, con diferentes alcances. Úselo-Wshadow
con GCC para que estos problemas se informen automáticamente.-Wshadow
no esté incluido en-Wall
.-Wshadow
advierte sobre el sombreado de variables globales, lo que fácilmente podría resultar molesto en proyectos más grandes.-Wextra
no 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.-Wshadow
tiene 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 i
que 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
i
dentro 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
i
está oculto, el código dentro del cuerpo del ciclo anidado tendría acceso solo al valor deli
ciclo anidado, noi
desde el ciclo exterior. En situaciones en las que el bucle anidado no necesita acceso al exteriori
dicho 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
int
bucle 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
i
s. si llamamos al exteriori
coni_1
y al interiori
coni_2
, el alcance de lai
s 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
for
bucle interno que para elfor
bucle 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 i
declarado 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 i
en el bucle externo (o, con otras palabras: en el alcance interno todos los accesos a la variablei
van alint i
declarado en el alcance interno, dejandoint i
intacto 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 scope
tendrá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 quei
se 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 i
en 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