Namespaces
Variants

goto statement

From cppreference.net

Transfère le contrôle inconditionnellement vers l'emplacement souhaité.

Utilisé lorsqu'il est autrement impossible de transférer le contrôle vers l'emplacement souhaité en utilisant des constructions conventionnelles.

Table des matières

Syntaxe

attr-spec-seq (optionnel) goto label ;
label - cible label pour l'instruction goto
attr-spec-seq - (C23) liste optionnelle d' attributes , appliquée à l'instruction goto

Explication

L'instruction goto provoque un saut inconditionnel (transfert de contrôle) vers l'instruction préfixée par l' étiquette nommée (qui doit apparaître dans la même fonction que l'instruction goto) , sauf lorsque ce saut entrerait dans la portée d'un tableau à longueur variable ou d'un autre type modifiable variablement . (depuis C99)

Un label est un identifiant suivi d'un deux-points ( : ) et d'une instruction (jusqu'à C23) . Les labels sont les seuls identifiants qui ont une portée de fonction : ils peuvent être utilisés (dans une instruction goto) n'importe où dans la même fonction où ils apparaissent. Il peut y avoir plusieurs labels avant toute instruction.

L'entrée dans la portée d'une variable non modifiable de manière variable est autorisée :

goto lab1; // OK: entrée dans la portée d'une variable régulière
    int n = 5;
lab1:; // Note: n n'est pas initialisé, comme s'il était déclaré par int n;
//   goto lab2;   // Erreur: entrée dans la portée de deux types VM
     double a[n]; // un VLA
     int (*p)[n]; // un pointeur VM
lab2:

Si goto quitte la portée d'un VLA, celui-ci est désalloué (et peut être réalloué si son initialisation est exécutée à nouveau) :

{
   int n = 1;
label:;
   int a[n]; // réalloué 10 fois, chaque fois avec une taille différente
   if (n++ < 10) goto label; // quitter la portée d'un VM
}
(depuis C99)

Mots-clés

goto

Notes

Étant donné que les déclarations ne sont pas des instructions, une étiquette précédant une déclaration doit utiliser une instruction nulle (un point-virgule immédiatement après le deux-points). La même chose s'applique à une étiquette avant la fin d'un bloc.

(until C23)

C++ impose des limitations supplémentaires sur l'instruction goto , mais autorise les étiquettes avant les déclarations (qui sont des instructions en C++).

Exemple

#include <stdio.h>
int main(void)
{
    // goto peut être utilisé pour quitter facilement une boucle multi-niveaux
    for (int x = 0; x < 3; x++) {
        for (int y = 0; y < 3; y++) {
            printf("(%d;%d)\n",x,y);
            if (x + y >= 3) goto endloop;
        }
    }
endloop:;
}

Sortie :

(0;0)
(0;1)
(0;2)
(1;0)
(1;1)
(1;2)

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.8.6.1 L'instruction goto (p: 110-111)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.8.6.1 L'instruction goto (p: 152-153)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.8.6.1 L'instruction goto (p: 137-138)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 3.6.6.1 L'instruction goto

Voir aussi

Documentation C++ pour goto statement