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.
Es un
alcance de bloque
marcado por
{}
llaves.
Por lo general, se usa para marcar el área de
almacenamiento automático
.
En su caso, no parece hacer nada, ya que el
bucle for
tiene su propio alcance en C ++ estándar.
{
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.