usando - Validez de forzar al menos una iteración de for loop con goto.
ejemplos usando while en c++ (6)
¿Se supone que goto siempre omite la expresión condicional del bucle for?
Sí. Un salto goto es siempre un salto incondicional y la ejecución se llevará desde la etiqueta desde allí.
Del borrador de C11, § 6.8.6.1 La declaración de goto :
Una instrucción goto provoca un salto incondicional a la instrucción con el prefijo de la etiqueta nombrada en la función de cierre.
Con la única excepción de ser:
El identificador en una declaración goto debe nombrar una etiqueta ubicada en algún lugar de la función de cierre. Una declaración goto no saltará desde fuera del alcance de un identificador que tenga un tipo modificado de forma variable hasta dentro del alcance de ese identificador.
Descargo de responsabilidad: Sé que es oscuro, y no lo programaría así. Soy consciente de la declaración de " do-while
preferida, en lugar de eso, la pregunta es más sobre la validez de un constructo de lenguaje específico.
¿Se supone que goto
siempre omite la expresión condicional del bucle for
? Por lo que observé, omite la primera (es decir, la inicialización) y la segunda expresión. ¿Esto sucederá siempre de esta manera o es este comportamiento puramente dependiente del compilador?
#include <stdio.h>
int main(void)
{
int m = 5;
goto BODY;
for (m = 0; m < 5; m++)
BODY: puts("Message"); // prints "Message" once
printf("m = %d/n", m); // prints m = 6
return 0;
}
Debería usar un bucle do/while
while, por ejemplo, si tiene lo siguiente para el bucle:
for(A ; B ; C)
{
D;
}
Debe usar el siguiente bucle do / while:
A;
do
{
D;
C;
}while(B);
Lo que obligará a una primera iteración.
EDITAR
Ver el comentario por chux: Si D;
contiene continue
, de esta manera no funcionará, necesitará otra forma
Editar II
A medida que se editó la pregunta, esta respuesta ya no es la respuesta directa a la pregunta, pero no la eliminaré, ya que podría ayudar a alguien ...
Esto es perfectamente legal en c. No hay nada de malo en saltar a un bucle for siempre que no se salte ninguna declaración o inicialización de variables automáticas.
En su caso, m se incrementa una vez y el bucle termina debido a que se cumple la condición de parada.
La instrucción goto
en su código está provocando un salto incondicional a una instrucción dentro de un bucle for
Cuando se ejecuta esa instrucción, se supone que el flujo del programa depende de la expresión condicional en el bucle. Entonces, sí, la inicialización dentro del bucle se salta
Sí, estás saltando sobre m = 0
y m < 5
, y esto es como debería ser.
for (A; B; C)
D;
es equivalente a
{
A;
loop:
if (B)
{
D;
C;
goto loop;
}
}
No hay manera de transferir el control a un punto entre A
y B
La semántica de su bucle es exactamente igual a esta versión de "goto puro":
int m = 5;
goto BODY;
m = 0;
loop:
if (m < 5)
{
BODY: puts("Message"); // prints "Message" once
m++;
goto loop;
}
printf("m = %d/n", m); // prints m = 6
Una instrucción goto en la programación en C proporciona un salto incondicional desde ''goto'' a una instrucción etiquetada en la misma función.
Tenga en cuenta el término incondicional aquí.
así que sí se supone que omite la expresión condicional de for
loop.