c++ - sentencia - ¿Por qué la declaración de variables funciona bien como condición de bucle for?
que es if else en programacion (4)
¿Cuál es el valor / tipo de retorno de una declaración como int i = 5
?
¿Por qué no compila este código?
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); (int i = 5)==5 ; ++i)std::cout << i;
}
mientras esto hace
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); int i = 5; ++i)std::cout << i;
}
Aunque de acuerdo con la sintaxis de un bucle for, la instrucción de inicialización debería aparecer primero, y luego la comprobación y luego la actualización, ya que su instrucción de comprobación es una inicialización en el segundo ejemplo, i se inicializa como 5 como parte de la comprobación y el bucle for es continuado.
El uso de la llamada foo () en la inicialización no hace ninguna diferencia en el bucle for, ya que el tipo de retorno es nulo. Si coloca 0 en lugar de foo (), obtendrá la misma salida.
Ahora consideremos el primer ejemplo , su estado de cuenta es una inicialización, al igual que el segundo ejemplo, y funcionaría si no tuviera esos corchetes allí. Dado que una declaración no devuelve ningún valor, (int i = 5) no devuelve ningún valor y, por lo tanto, no se puede comparar con 5 en "== 5".
Sin embargo, si intenta "para (foo (); int i = 5 == 5; ++ i) ..." , la instrucción de comprobación se compila igual que int i = (5 == 5) . Como 5 == 5 es verdadero, devuelve un valor de 1, que luego se inicializa como el valor de i. Así, la salida es 11111 ......
TL; DR: dado que una declaración no devuelve ningún valor, (int i = 5) no devuelve ningún valor y, por lo tanto, no puede compararse con 5 en "== 5" como en el primer ejemplo
Problema resuelto.
El bucle for requiere que la condición sea una expresión o una declaración:
condición - bien
- una expresión que es convertible contextualmente a bool. Esta expresión se evalúa antes de cada iteración, y si produce falso, se sale del bucle.
- una declaración de una sola variable con un inicializador de corsé o igual. el inicializador se evalúa antes de cada iteración, y si el valor de la variable declarada se convierte en falso, se sale del bucle.
El primer código no funciona porque (int i = 5)==5
no es una expression válida en absoluto. (Tampoco es una declaración). Se supone que el operando del operator==
es una expresión, pero int i = 5
es una declaración, no una expresión.
El segundo código funciona porque int i = 5
coincide con el segundo caso válido para la condición ; Una declaración de una sola variable con un inicializador igual. El valor de i
se convertirá a bool
para juicio; que siempre es 5
, luego conduce a un bucle infinito.
Este código cumple en la práctica:
for (foo(); int i = 5 == 5; ++i)
Comprueba si 5 == 5
y establece i en este resultado booleano (que es 1) -> bucle infinito
for(foo(); int i = 5; ++i)
Esto simplemente verifica el valor de i
después de configurarlo en 5, así que ... cuando se convierte a bool
también es true
-> bucle infinito
La sintaxis de un bucle for en lenguaje de programación C es la siguiente:
for ( init; condition; increment ) {
statement(s);
}
El paso de inicio se ejecuta primero, y solo una vez. Puede usar init para declarar e inicializar cualquier variable de control de bucle.
A continuación, se evalúa la condición. Si es verdad, se ejecuta el cuerpo del bucle. Si es falso, el cuerpo del bucle no se ejecuta y el flujo de control salta a la siguiente declaración justo después del bucle ''for''.
Después de que el cuerpo del bucle ''for'' se ejecute, el flujo de control vuelve a la instrucción de incremento. Esta declaración le permite actualizar cualquier variable de control de bucle.
Teniendo en cuenta su primera declaración del programa:
for(foo(); (int i = 5)==5 ; ++i)std::cout << i;
La declaración anterior le dará el siguiente error (compilado usando GCC):
error: expected primary-expression before ‘int’
for(foo(); (int i = 5) == 5; ++i)std::cout << i;
error: expected ‘)’ before ‘int’
La expresión primaria en C
puede ser cualquiera de varias cosas:
a name (of a variable or a function)
a typename
an operator
a keyword like if or while
the list goes on and on ...
Este error se debe al hecho de que la instrucción (int i = 5) == 5
no es una expresión válida y el compilador está tratando de interpretar de alguna otra manera. Sin embargo, el segundo programa funciona como int i = 5
declaración int i = 5
que se puede usar como condición válida para la verificación del bucle for cuando dicha declaración se evalúa al valor del initializer
que es 5
en su segundo programa. Sin embargo, el segundo programa será un bucle infinito y seguirá imprimiendo 5
en el terminal. Sin embargo, si el valor del inicializador era 0
, la condición no pasa a ser falsa en su primera verificación y el cuerpo del bucle no se ejecutará ni una sola vez.