Namespaces
Variants

goto statement

From cppreference.net

원하는 위치로 무조건적으로 제어를 전달합니다.

일반적인 구문을 사용하여 원하는 위치로 제어를 전달하는 것이 불가능한 경우 사용됩니다.

목차

구문

attr-spec-seq (선택 사항) goto label ;
label - goto 문의 대상 label
attr-spec-seq - (C23) 선택적 attributes 목록, goto 문에 적용됨

설명

goto 문은 명명된 레이블 이 접두사로 붙은 문으로의 무조건 점프(제어 이전)를 발생시킵니다 (단, 이 점프가 가변 길이 배열 또는 다른 가변 수정 타입 의 범위에 진입하는 경우는 제외) (C99부터)

label 은 콜론( : ) 뒤에 오는 식별자입니다 (그리고 문장) (C23까지) . 레이블은 함수 범위 를 가지는 유일한 식별자입니다: 레이블이 나타나는 동일 함수 내 어디에서나(goto 문에서) 사용할 수 있습니다. 모든 문장 앞에 여러 개의 레이블이 있을 수 있습니다.

가변 수정이 아닌 변수의 범위로 진입하는 것은 허용됩니다:

goto lab1; // OK: 일반 변수의 범위로 진입
    int n = 5;
lab1:; // 참고: n은 초기화되지 않음, int n;으로 선언된 것처럼
//   goto lab2;   // 오류: 두 VM 타입의 범위로 진입
     double a[n]; // VLA
     int (*p)[n]; // VM 포인터
lab2:

만약 goto 가 VLA의 범위를 벗어나면, 해당 VLA는 할당이 해제됩니다 (초기화가 다시 실행되면 재할당될 수 있습니다):

{
   int n = 1;
label:;
   int a[n]; // 10번 재할당됨, 각각 다른 크기로
   if (n++ < 10) goto label; // VM의 범위를 벗어남
}
(C99부터)

키워드

goto

참고 사항

선언문은 문(statement)이 아니므로 선언문 앞에 오는 레이블은 널 문(null statement, 콜론 바로 뒤에 세미콜론)을 사용해야 합니다. 블록 끝 앞에 오는 레이블에도 동일하게 적용됩니다.

(until C23)

C++는 goto 문에 추가적인 제한을 부과하지만, 선언문(이는 C++에서 명령문입니다) 앞에 레이블을 허용합니다.

예제

#include <stdio.h>
int main(void)
{
    // goto는 다중 레벨 루프를 쉽게 벗어나는 데 사용할 수 있습니다
    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 문 (p: 110-111)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.8.6.1 goto 문 (p: 152-153)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.8.6.1 goto 문 (p: 137-138)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.6.6.1 goto 문

참고 항목

C++ 문서 참조: goto