c++ - tiempos - ¿Por qué la condición del tiempo está fuera del ámbito del hacer?
tiempo estandar pdf (1)
Si desea mantener el value
ámbito local para el bucle while, puede hacer esto en su lugar:
do
{
Type value(GetCurrentValue());
Process(value);
if (! condition(value) )
break;
} while(true);
Esto es solo una preferencia personal, pero me parece while
bucles estructurados como los siguientes son más legibles ( while
lugar de do-while
):
while(true) {
Type value(GetCurrentValue());
Process(value);
if (! condition(value) ) {
break;
}
}
Las reglas de alcance en C / C ++ funcionan de la siguiente manera: las variables locales declaradas dentro de un bloque de apoyo {...}
son locales / visibles solo para ese bloque. Por ejemplo:
int a = 1;
int b = 2;
{
int c = 3;
}
std::cout << a;
std::cout << b;
std::cout << c;
Se quejará de que no sea declarado.
En cuanto a la lógica, es solo una cuestión de coherencia y "así es como se define el lenguaje"
Más a menudo que no necesitamos bucles como este
do
{
Type value(GetCurrentValue());
Process(value);
}while(condition(value));
Desafortunadamente esto no se compilará, porque el alcance del value
termina en }
. Lo que significa que tendré que declararlo fuera del bucle.
Type value;
do
{
value = GetCurrentValue();
Process(value);
}while(condition(value));
No me gusta esto por al menos dos razones. Por un lado, me gusta declarar cosas localmente. Y en segundo lugar, esto es un problema si el valor no es asignable o constructible por defecto, sino que se puede construir por copia.
Entonces, mi pregunta tiene dos lados. Primero, me gustaría saber si también hubo una razón / dificultad particular para extender el alcance del do while a la condición final (al igual que el alcance de las variables declaradas en for loop incluye el cuerpo del bucle for a pesar de ser físicamente fuera de los tirantes). Y si crees que la respuesta a mi primera pregunta es: "Así es como es. No preguntes por qué preguntas". entonces me gustaría saber si hay expresiones idiomáticas que puedan ayudar a escribir bucles de hacer do-while similares a los de mi ejemplo, pero sin las desventajas que mencioné.
Espero que las preguntas sean claras.