Оператор goto
Безусловно переносит управление в нужное место.
Используется, когда иначе невозможно перенести управление в нужное место с помощью стандартных конструкций.
Синтаксис
attr-spec-seq(необязательно) goto
метка ;
|
| метка | - |
целевая метка для оператора goto
|
| attr-spec-seq | - |
(C23)необязательный список атрибутов, применяемых к оператору goto
|
Объяснение
Оператор goto вызывает безусловный переход (перенос управления) к оператору, помеченному указанной меткой метка (которая должна появляться в той же функции, что и оператор goto), за исключением случаев, когда такой переход войдет в область действия массива переменной длины или другого типа с переменным размером.(с C99)
Метка — это идентификатор, за которым следует двоеточие (:) и оператор(до C23). Метки — единственные идентификаторы, имеющие общий для всей функции срок действия: они могут быть использованы (в операторе goto) в любом месте той же функции, в которой они появляются. Перед оператором может быть несколько меток.
|
Вход в область действия неизменяемой переменной разрешен: 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:Если {
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
} |
(с C99) |
Ключевые слова
Примечания
|
Поскольку объявления не являются операторами, метка перед объявлением должна использовать пустой оператор (точка с запятой сразу после двоеточия). То же самое относится к метке перед концом блока. |
(до C23) |
C++ накладывает дополнительные ограничения на оператор goto, но разрешает метки перед объявлениями (которые являются операторами в C++).
Пример
#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:;
}Вывод:
(0;0) (0;1) (0;2) (1;0) (1;1) (1;2)
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 6.8.6.1 Оператор goto (с. 110-111)
- Стандарт C11 (ISO/IEC 9899:2011):
- 6.8.6.1 Оператор goto (с. 152-153)
- Стандарт C99 (ISO/IEC 9899:1999):
- 6.8.6.1 Оператор goto (с. 137-138)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 3.6.6.1 Оператор goto
См. также
Документация C++ для goto оператора
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/goto