Spec-Zone.ru › C

Оператор 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:

Если goto выходит из области действия VLA, он освобождается (и может быть перевыделен, если его инициализация выполняется снова):

{
   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)

Ключевые слова

goto

Примечания

Поскольку объявления не являются операторами, метка перед объявлением должна использовать пустой оператор (точка с запятой сразу после двоеточия). То же самое относится к метке перед концом блока.

(до 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API