2010-03-06 9 views
9

¿Por qué lo siguiente no da un error?¿Por qué funciona el uso del mismo nombre de variable de conteo en bucles FOR anidados?

for (int i=0; i<10; ++i) // outer loop 
{ 
    for (int i=0; i<10;++i) // inner loop 
    { 
    //...do something 
    } 
//...do something else 
} 

La manera en que yo entiendo, las variables entre llaves ({...}) son en su alcance sólo dentro de estos aparatos. Pero el bucle interno está dentro de las llaves del bucle externo. Entonces, tan pronto como declaro int i=0 para el ciclo interno, ¿no debería obtener un error sobre las definiciones múltiples?

+0

Como probablemente ya lo hace ahora, mientras funciona, no debería hacerlo. Puede resultar en menos legibilidad y algunos errores muy desagradables. – helpermethod

Respuesta

14

En realidad está creando una nueva variable con el mismo nombre que otra variable. Dado que están en diferentes ámbitos, esto está permitido, y la variable en el ámbito interno "posee" el nombre. No podrá acceder al i con alcance exterior dentro del alcance interno.

La declaración for loop en sí es parte del alcance del bucle for, por lo que cuenta como parte del ámbito interno en el caso del segundo i.

+0

Enlace útil con C++ ejemplos de diferentes ámbitos: http://h30097.www3.hp.com/docs//base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_016.HTM –

+0

@Justin no hay manera de acceder al bucle externo i en absoluto ? –

+0

No. Simplemente diga el nombre 'i' del lazo interno otra cosa. Es común ver variables de índice de bucle anidado como caracteres progresivos del alfabeto que comienzan con 'i',' j', 'k', etc. –

2

La mejor manera de entender esto es pensar en todo lo que entre el (e) cuando se declara un bucle como dentro de las llaves de ese bucle for, al menos en lo se relaciona con el alcance.

Para entender esto, considere una función en la que no haya declarado ninguna variable x, entonces el siguiente código en su interior le dará un error. (También estamos asumiendo que no tiene ninguna otra variable x se define a nivel mundial.)

for (int x = 0; x < 10; x++) 
{ 
    something(); 
} 
x++; // error, x is not defined. 
2

El compilador de C++ acepta esto como válida, ya que el alcance de la segunda es sólo dentro de las llaves {}. Si se implementa la misma en C, verá un error como este:

$ gcc test.c 
test.c: In function ‘main’: 
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode 
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode 

Esto es ilegal en la mayoría de los dialectos de C; es la declaración de un C legal ++, y por lo tanto puede ser aceptada si está compilando C con un compilador de C++:

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

Es común tener un iterador de bucle sólo en el ámbito del bucle en C++, pero C hace seguro (especialmente con el C90, no C99), que la declaración está fuera del alcance del ciclo. Espero que ayude ... :-)

Por lo tanto, cuando declara otro bucle FOR en el anterior, el alcance comienza de nuevo y su código se compila sin ningún error en C++ o C99. Esta es la norma usual aceptada para una declaración de alcance.

+0

Es el mismo concepto incluso cuando se utiliza la misma variable en el mismo ámbito, por ejemplo: 'for (int i = 0; i <10; i ++) {// algún código} para (int i = 0; i <10; i ++) {// algún otro código} 'Es válido en C++ pero no válido en la mayoría de los dialectos C. – reubenjohn

0

¿ESTÁ SEGURO DE QUE NO OBTIENE UN ERROR MIENTRAS EJECUTA ESTE ...?

Está tratando de definir las dos variables int dentro del mismo límite. Debido a esto, generará el error.en C# si prueba el mismo código obtendrá el error

Error 1 No se puede declarar una variable local llamada 'i' en este ámbito porque daría un significado diferente a 'i', que ya está utilizado en un ámbito "principal o actual" para designar algo más

+1

¡SÍ, ESTOY SEGURO ...! No, si entiendo mejor el problema, creo que el comportamiento de C++ es correcto. –

Cuestiones relacionadas