c++ - sentencia - lenguaje c if else ejemplos
¿Por qué no puedes declarar una variable dentro de la porción de expresión de un ciclo do while? (6)
Agrega esto
#define do(cond) switch (cond) do default:
al comienzo de tu código
Ahora, puedes escribir
do (int i = get_data())
{
// your code
} while ((i = get_data()));
Es importante que este #define
no rompa la sintaxis original de la palabra clave do en el ciclo do-while.
Sin embargo, admito que es oscuro.
La siguiente sintaxis es válida:
while (int i = get_data())
{
}
Pero el siguiente no es:
do
{
} while (int i = get_data());
Podemos ver por qué a través del borrador del estándar:
[N4140/6.4]
1
[...]condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
2
Las reglas para las condiciones se aplican tanto a los enunciados de selección como a los enunciadosfor
ywhile
(6.5). [...]
[N4140/6.5]
1
Las instrucciones de iteración especifican el bucle.iteration-statement:
while
( condition ) statementdo
statementwhile
( expression ) ;
En cambio, estás obligado a hacer algo feo como:
int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
¿Cuál es la razón de esto?
Esto se debe a que todo lo demás sigue la práctica de declarar variables antes de usarlas, por ejemplo:
public static void main(String[] args){
// scope of args
}
for(int i=1; i<10; i++){
// scope of i
}
{
...
int somevar;
//begin scope of var
...
//end of scope of var
}
Esto se debe a que las cosas se analizan de arriba hacia abajo y porque seguir esta convención mantiene las cosas intuitivas, por lo que puedes declarar un tiempo (int var <10) porque el alcance de esa var será el área dentro del ciclo, después de la declaración.
El hacer mientras no tiene ningún sentido para declarar una variable porque el alcance terminaría al mismo tiempo que se verificaría porque es cuando ese bloque se termina.
Hay varias razones por las cuales sería difícil de permitir.
El lenguaje se atiene a la regla general de que todo debe declararse por encima del punto de uso. En este caso, la variable declarada en do-while
se declararía por debajo de su alcance natural esperado (el cuerpo del ciclo). Hacer que esta variable sea accesible dentro del ciclo habría requerido un tratamiento especial para do-while
ciclos de " do-while
. Aunque conocemos ejemplos de este tipo de tratamiento especial (por ejemplo, los órganos de funciones de los miembros de la clase pueden ver a todos los miembros de la clase, incluidos los que se mencionan a continuación ), probablemente no haya mucho sentido práctico al hacerlo en los ciclos de do-while
.
En el caso de do-while
estas reglas de tratamiento especiales también requerirían encontrar una forma significativa de manejar la inicialización de las variables declaradas de esta manera. Tenga en cuenta que en el lenguaje C ++ la duración de dicha variable se limita a una iteración del ciclo, es decir, la variable se crea y se destruye en cada iteración. Esto significa que para el ciclo " do-while
la variable siempre permanecerá sin inicializar, a menos que se introduzca alguna regla que de algún modo mueva la inicialización al principio del cuerpo del ciclo. Eso sería bastante confuso en mi opinión.
Parece que el alcance sería el problema, ¿cuál sería el alcance de lo que declare en la parte de while
de una declaración do while
? Parecería bastante antinatural tener una variable disponible dentro del ciclo cuando la declaración está realmente debajo del bucle en sí. No tiene este problema con los otros bucles ya que las declaraciones vienen antes del cuerpo del bucle.
Si miramos el borrador del estándar de C ++ , vemos desde la sección 6.5.1
La sentencia while que para la sentencia while que:
while (T t = x) statement
es equivalente a:
label:
{ // start of condition scope
T t = x;
if (t) {
statement
goto label;
}
} // end of condition scope
y:
La variable creada en una condición se destruye y se crea con cada iteración del ciclo.
¿Cómo podríamos formular esto para el caso do while
?
y como cdhowie señala si miramos la sección 6.5.2
La declaración de do dice ( énfasis mío ):
En la declaración do, la subestación se ejecuta repetidamente hasta que el valor de la expresión se convierte en falso. La prueba se lleva a cabo después de cada ejecución de la declaración.
lo que significa que el cuerpo del ciclo se evalúa antes de que lleguemos siquiera a la declaración.
Si bien podríamos crear una excepción para este caso, violaría nuestro sentido intuitivo de que, en general, el punto de declaración para un nombre es después de ver la declaración completa ( con algunas excepciones, por ejemplo, variables de miembros de clase ) con beneficios poco claros. El punto de declaración se trata en la sección 3.3.2
.
Sería muy poco natural tener una declaración de i
después del bloqueo y luego poder acceder a él en el bloque. La declaración en for
y while
son buenas abreviaturas que dan un uso de alcance limitado a una variable que se necesita en la lógica de bucle.
Más limpio para hacerlo de esta manera:
int i;
do {
i = get_data();
// whatever you want to do with i;
} while (i != 0);
Tu primera sintaxis es válida mientras que la segunda no. Sin embargo, su ciclo while se repetirá siempre, incluso si su función get_data () devuelve 0. No estoy seguro de si eso es exactamente lo que quiere que suceda.