tipos - contador en php 3 casos diferentes
¿Puede un bucle ''for'' dentro de un bucle ''for'' usar el mismo nombre de variable de contador? (12)
Bueno, puedes hacer esto sin que tus scripts tengan un problema, pero debes evitar esa estructura. Suele llevar a confusión.
¿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++)
{
}
}
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
Eso es completamente posible, pero tenga en cuenta que no podrá abordar la primera declaración declarada.
for(int i = 0; i < 10; i++)//I MEAN THE ONE HERE
{
for(int i = 0; i < 10; i++)
{
}
}
en el segundo bucle dentro del segundo bucle hijo
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)//the new i
{
// i cant see the i thats before this new i here
}
}
Si necesita ajustar u obtener el valor de la primera i, use j en el segundo bucle
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
}
}
y si su creatividad es suficiente, puede hacer ambas cosas en un bucle
for(int i ,j= 0; i < 10; (j>9) ? (i++,j=0) : 0 ,j++)
{
printf("%d %d/n",i,j);
}
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 );
Puede usar el mismo nombre (identificador). Será un objeto diferente. No se afectarán entre sí. Dentro del bucle interno, no hay manera de referirse al objeto utilizado en el bucle externo (a menos que haga provisiones especiales para eso, ya que le proporciona un puntero).
Este es generalmente un estilo malo, es propenso a la confusión y debe evitarse.
Los objetos son diferentes solo si el interior se define por separado, como en el
int i
que ha mostrado.
Si se utiliza el mismo nombre sin definir un nuevo objeto, los bucles utilizarán el mismo objeto e interferirán entre sí.
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í, puede usar el mismo nombre de variable de contador para un bucle interno interno que para el externo.
Desde for loop :
for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
La declaración de expresión utilizada como loop_statement establece su propio ámbito de bloque, distinto del ámbito de init_clause .
for (int i = 0; ; ) { long i = 1; // valid C, invalid C++ // ... }
El ámbito de loop_statement está anidado dentro del ámbito de init_clause .
De los Estándares C # 6.8.5p5 declaraciones de iteración [énfasis mío]
Una declaración de iteración es un bloque cuyo alcance es un subconjunto estricto del alcance de su bloque envolvente. El cuerpo del bucle también es un bloque cuyo alcance es un subconjunto estricto del alcance de la instrucción de iteración .
De los Estándares C # 6.2.1p4 Alcances de los identificadores [énfasis mío]
.... Dentro del ámbito interno, el identificador designa la entidad declarada en el ámbito interno; la entidad declarada en el ámbito externo está oculta (y no es visible) dentro del ámbito interno.
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.
Regla de ámbito: una variable declarada en una sentencia for solo se puede utilizar en esa sentencia y en el cuerpo del bucle.
Si en su código ha definido múltiples instancias de i en los 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.
int main(void) {
int i = 2; //defined with file global scope outside of a function and will remain 2
if(1)
{ //new scope, variables created here with same name are different
int i = 5;//will remain == 5
for(int i = 0; i < 10; i++)
{ //new scope for "i"
printf("i value in first loop: %d /n", i); // Will print 0 in first iteration
for(int i = 8; i < 15; i++)
{ //new scope again for "i", variable with same name is not the same
printf("i value in nested loop: %d /n", i); // Will print 8 in first iteration
}
}
}
return 0;
}
Pero no se recomienda usar el mismo nombre de variable, ya que es difícil de entender y se convierte en un código que no se puede mantener más adelante.