goto
statement
Безусловно передает управление.
Используется, когда иным способом невозможно передать управление в нужное место с помощью других операторов.
Содержание |
Синтаксис
attr
(необязательно)
goto
label
;
|
|||||||||
Объяснение
Оператор goto передает управление в место, указанное меткой . Оператор goto должен находиться в той же функции, что и метка , на которую он ссылается, и может располагаться до или после метки.
Если передача управления выходит за пределы области видимости любых автоматических переменных (например, при переходе назад к точке до объявления таких переменных или при переходе вперед за пределы составного оператора, где переменные находятся в области видимости), деструкторы вызываются для всех переменных, чья область видимости была покинута, в порядке, обратном порядку их создания.
Оператор goto не может передавать управление внутрь control-flow-limited statement , но может передавать управление из control-flow-limited statement (при этом соблюдаются указанные выше правила относительно автоматических переменных в области видимости).
Если передача управления входит в область видимости любых автоматических переменных (например, при переходе вперёд через объявляющую инструкцию), программа является некорректной (не может быть скомпилирована), если только все переменные, чья область видимости входит, не имеют следующие типы:
- скалярные типы, объявленные без инициализаторов
- классовые типы с тривиальными конструкторами по умолчанию и тривиальными деструкторами, объявленные без инициализаторов
- cv-квалифицированные версии одного из вышеперечисленного
- массивы одного из вышеперечисленного
(Примечание: те же правила применяются ко всем формам передачи управления)
Примечания
В языке программирования C оператор goto имеет меньше ограничений и может войти в область видимости любой переменной, кроме variable-length array или variably-modified pointer.
Ключевые слова
Пример
#include <iostream> struct Object { // non-trivial destructor ~Object() { std::cout << 'd'; } }; struct Trivial { double d1; double d2; }; // trivial ctor and dtor int main() { int a = 10; // loop using goto label: Object obj; std::cout << a << ' '; a -= 2; if (a != 0) goto label; // jumps out of scope of obj, calls obj destructor std::cout << '\n'; // goto can be used to efficiently leave a multi-level (nested) loops for (int x = 0; x < 3; ++x) for (int y = 0; y < 3; ++y) { std::cout << '(' << x << ',' << y << ") " << '\n'; if (x + y >= 3) goto endloop; } endloop: std::cout << '\n'; goto label2; // jumps into the scope of n and t [[maybe_unused]] int n; // no initializer [[maybe_unused]] Trivial t; // trivial ctor/dtor, no initializer // int x = 1; // error: has initializer // Object obj2; // error: non-trivial dtor label2: { Object obj3; goto label3; // jumps forward, out of scope of obj3 } label3: std::cout << '\n'; }
Вывод:
10 d8 d6 d4 d2 (0,0) (0,1) (0,2) (1,0) (1,1) (1,2) d d
Смотрите также
|
Документация по C
для
goto
|
Внешние ссылки
|
Популярное эссе Эдсгера В. Дейкстры «Goto Considered Harmful» (оригинально опубликованное в "Letter to Communications of the ACM (CACM)", vol. 11 #3, March 1968, pp. 147-148.), представляет обзор многочисленных тонких проблем, которые может вызвать неосторожное использование этого ключевого слова. |