while loop for c++ for-loop scope

c++ - loop - Para bucle dentro de sus propias llaves



for() c++ (4)

Me he encontrado con este diseño de bucle for:

#include <iostream> int main() { { for (int i = 0; i != 10; ++i) { std::cout << "delete i->second;" << std::endl; } } { for (size_t i = 0; i < 20; ++i) { std::cout << "delete m_indices[i];" << std::endl; } } return 0; }

Me preguntaba para qué es esta capa adicional de aparatos ortopédicos. Esto aparece algunas veces en nuestra base de código.


Érase una vez, hace muchas lunas, VS6 existía y era popular. Sin embargo, no se ajustó a varios estándares de C ++; lo cual era razonable en el momento en que se lanzó justo antes (en el mismo año) que el estándar se lanzó oficialmente; sin embargo, se adhirió al borrador de la norma hasta donde yo sé.

Una de las normas que cambió entre el borrador y la norma oficial fue la vida útil de las variables de bucle creadas en la primera sección; conduciendo al siguiente código que no compila

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

porque fui redefinido por el segundo for loop.

Mientras que otros compiladores también sufrieron este error; Destaco el VS6 porque siguió siendo la única versión de Visual Studio durante varios años después del lanzamiento del estándar, pero nunca lanzó una actualización para este problema en particular; lo que significa que tuvo un impacto más significativo.

Una solución a esto es forzar el ciclo for completo dentro de su propio alcance como lo ha mostrado.


En su ejemplo particular no hay razón para ellos.

A veces puede querer crear un ámbito para una variable:

float average; // ... { int sum = 0; for (int i = 0; i < count; ++i) { sum += v[i]; } average = (float)sum / count; } // use average // sum not in scope here

Sin embargo, veo esto como un antipatrón. Por lo general, si necesita hacer esto, lo más probable es que el for debería ser su propia función.



{ y } creará un ámbito y, si define algunas variables en el ámbito, no podrá acceder a ellas desde el exterior. Pero for ya crear ese alcance. Asi que

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

es lo mismo que

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

pero si define algo entre ellos, hay una diferencia

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

En este ejemplo, a no se podrá acceder desde fuera del alcance.