goto statement
Transfers control unconditionally to the desired location.
Used when it is otherwise impossible to transfer control to the desired location using conventional constructs.
Syntax
attr-spec-seq(optional) goto label ;
|
|||||||||
label | - | target label for the goto statement
|
attr-spec-seq | - | (C23)optional list of attributes, applied to the goto statement
|
Explanation
The goto
statement causes an unconditional jump (transfer of control) to the statement prefixed by the named label (which must appear in the same function as the goto statement)
, except when this jump would enter the scope of a variable-length array or another variably-modified type.
(since C99)
A label is an identifier followed by a colon (:
)and a statement(until C23). Labels are the only identifiers that have function scope
Entering the scope of a non-variably modified variable is permitted: goto lab1; // OK: going into the scope of a regular variable int n = 5; lab1:; // Note, n is uninitialized, as if declared by int n; // goto lab2; // Error: going into the scope of two VM types double a[n]; // a VLA int (*p)[n]; // a VM pointer lab2: If { int n = 1; label:; int a[n]; // re-allocated 10 times, each with a different size if (n++ < 10) goto label; // leaving the scope of a VM } |
(since C99) |
Keywords
Notes
Because declarations are not statements, a label before a declaration must use a null statement (a semicolon immediately after the colon). Same applies to a label before the end of a block. |
(until C23) |
C++ imposes additional limitations on the goto
statement, but allows labels before declarations (which are statements in C++).
Example
#include <stdio.h> int main(void) { // goto can be used to leave a multi-level loop easily 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:; }
Output:
(0;0) (0;1) (0;2) (1;0) (1;1) (1;2)
References
- C17 standard (ISO/IEC 9899:2018):
- 6.8.6.1 The goto statement (p: 110-111)
- C11 standard (ISO/IEC 9899:2011):
- 6.8.6.1 The goto statement (p: 152-153)
- C99 standard (ISO/IEC 9899:1999):
- 6.8.6.1 The goto statement (p: 137-138)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.6.6.1 The goto statement
See also
C++ documentation for
goto statement |