while usando terminar salir for ejemplos como ciclo bucle c language-lawyer goto

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.