« Programmation C/Itérations » : différence entre les versions

Contenu supprimé Contenu ajouté
RM77 (discussion | contributions)
m Révocation des modifications de 195.132.45.161 (retour à la version précédente de Tavernierbot)
Ligne 128 :
</source>
 
Ce label peut être mis à n'importe quel endroit dans la fonction, y compris avant ou après le <tt>goto</tt>, ou dans un autre bloc que là où sont utilisés la ou les instructions <code>goto</code> pointant vers ce label. Les labels doivent être uniques au sein d'une même fonction, mais on peut les réutiliser dans une autre fonction.
Ce label peut être mcritique, qui a donné naissance à la [[w:Programmation structurée|programmation structurée]].
 
Un cas où l'emploi d'une instruction <code>goto</code> est tout à fait justifié, par exemple, est pour simuler le déclenchement d'une exception, pour sortir rapidement de plusieurs boucles imbriquées.
 
<source lang="c">
void boucle(void)
{
while (1)
{
struct Evenement_t * event;
 
attend_evenement();
 
while ((event = retire_evenement()))
{
switch (event->type) {
case FIN_TRAITEMENT:
goto fin;
/* ... */
}
}
}
fin:
/* ... */
}
</source>
 
Dans ce cas de figure, il serait possible d'utiliser aussi un booléen qui indique que le traitement est terminé, pour forcer la sortie des boucles. L'utilisation de <tt>goto</tt> dans cet exemple ne nuisant pas à la lisibilité du programme et étant tout aussi efficace, il est tout à fait légitime de l'utiliser.
 
Il faut cependant noter que cette instruction est souvent considérée comme à éviter. En effet, elle provoque un saut dans le code, qui se « voit » beaucoup moins bien que les structures de contrôle comme <tt>if</tt> ou <tt>while</tt>, par exemple. De fait, la pratique a montré qu'un abus de son utilisation rend un code source rapidement peu compréhensible, et difficilement maintenable. L'article de Edsger W. Dijsktra [http://www.acm.org/classics/oct95/ ''Go to considered harmful''] {{en}}, datant de 1968, est l'exemple le plus connu de cette critique, qui a donné naissance à la [[w:Programmation structurée|programmation structurée]].