Avant de lire le reste de cette réponse, veuillez lire les points suivants Aller à la déclaration considérée comme nuisible . Si vous ne voulez pas le lire en entier, voici ce que je considère comme le point clé :
L'utilisation débridée de la déclaration de destination a pour conséquence immédiate qu'il devient terriblement difficile de trouver un ensemble de coordonnées significatives pour décrire l'évolution du processus.
Ou pour reformuler, le problème avec goto
est que le programme peut arriver au milieu d'un bloc de code, sans que le programmeur comprenne l'état du programme à ce moment-là. Les constructions standard orientées blocs sont conçues pour délimiter clairement les transitions d'état, un bloc étiqueté break
est destiné à amener le programme à un état spécifique connu (en dehors du bloc étiqueté contenant).
Dans un programme impératif réel, l'état n'est pas clairement délimité par les frontières des blocs, de sorte qu'il est possible de se demander si l'étiquette break
est une bonne idée. Si le bloc change d'état de manière visible depuis l'extérieur du bloc et qu'il existe plusieurs points de sortie du bloc, alors une étiquette de type break
est équivalent à la primitive goto
. La seule différence est que, au lieu d'avoir la chance d'atterrir au milieu d'un bloc à état indéterminé, vous commencez un nouveau bloc à état indéterminé.
Donc, en général, je considérerais qu'une étiquette break
comme dangereux. À mon avis, c'est un signe que le bloc doit être converti en une fonction, avec un accès limité à la portée englobante.
Cependant, cet exemple de code était clairement le produit d'un générateur d'analyseur (le PO a commenté qu'il s'agissait du code source de Xerces). Et les générateurs d'analyseurs (ou les générateurs de code en général) prennent souvent des libertés avec le code qu'ils génèrent, car ils ont une connaissance parfaite de l'état et les humains n'ont pas besoin de le comprendre.