goto statement
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
{ 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
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
|