while usando for ejemplos ciclo caracteristicas bucle c++ c for-loop

c++ - usando - ciclo for



Error al redeclarear una variable de bucle for dentro del bucle (3)

A diferencia de C, C ++ tiene la regla,
C ++ 11-§6.5.3 / 1:

La declaración

for ( for-init-statement conditionopt ; expressionopt ) statement

es equivalente a

{ for-init-statement while ( condition ) { statement expression ; } }

excepto que los nombres declarados en la instrucción for-init están en la misma región declarativa que los declarados en la condición [...]

Esto significa que el alcance de la for-init-statement y la statement son los mismos * y el siguiente código causará un error

for(int i = 0; i < 5; i++){ int i = 10; // Invalid. // ... }

Cía,
C11-§6.8.5 / 5:

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 .

Por lo tanto, la statement tiene su propio alcance y el código anterior es válido y equivalente a

for(int i = 0; i < 5; i++){ { int i = 10; // Valid. // ... } }

Lectura sugerida: n3337: 6.5.1 La sentencia while / p (2). La misma referencia se puede encontrar en c ++ 17 draft (n4659) en la sección § 9.5.1 y §9.5.3.

Considere este fragmento de un programa en C:

for(int i = 0; i < 5; i++) { int i = 10; // <- Note the local variable printf("%d", i); }

Se compila sin ningún error y, cuando se ejecuta, da el siguiente resultado:

1010101010

Pero si escribo un bucle similar en C ++:

for(int i = 0; i < 5; i++) { int i = 10; std::cout << i; }

La compilación falla con este error:

prog.cc:7:13: error: redeclaration of ''int i'' int i = 10; ^ prog.cc:5:13: note: ''int i'' previously declared here for(int i = 0; i < 5; i++) ^

¿Por qué está pasando esto?


Esto se debe a que los lenguajes C y C ++ tienen diferentes reglas para volver a declarar las variables en un ámbito anidado en un bucle for :

  • C++ coloca a i en el ámbito del cuerpo del bucle, por lo que el segundo int i = 10 es una redeclaración, que está prohibida
  • C permite la redeclaración en un ámbito dentro de un bucle for ; La variable más interna "gana"

Aquí hay una demostración de un programa C en ejecución , y un programa C ++ que no se compila .

Al abrir un ámbito anidado dentro del cuerpo se corrige el error de compilación ( demo ):

for (int i =0 ; i != 5 ; i++) { { int i = 10; cout << i << endl; } }

Ahora, en el encabezado for e int i = 10 están en diferentes ámbitos, por lo que el programa puede ejecutarse.


No es redeclaración.

Mira esto con cuidado ...

for(int i = 0; i < 7; i++) { printf("i = %d/n", i); int i = 5; printf("new i = %d/n", i); }

Salida del código anterior: -

i = 0 new i = 5 i = 1 new i = 5 i = 2 new i = 5 i = 3 new i = 5 i = 4 new i = 5 i = 5 new i = 5 i = 6 new i = 5

Claramente, hay dos i ''s diferentes

El nuevo i tiene un alcance más local.

¿Es un error?

No

¿Cuál es el propósito?

Si no se permitiera, podría ser muy difícil mantener proyectos grandes, ya que constantemente se vería como colisión de nombres.

En general, sin embargo, se considera una práctica muy pobre dar el mismo nombre a diferentes variables en diferentes ámbitos, debe evitar hacerlo siempre que sea posible.

¿Por qué no hay ningún mensaje de advertencia?

Use gcc file_name.c -Wshadow para compilar.

EDITAR: También puede bloquear localmente las variables declaradas originalmente redeclarándolas en bucles for.