goto statement
원하는 위치로 무조건적으로 제어를 전달합니다.
일반적인 구문을 사용하여 원하는 위치로 제어를 전달하는 것이 불가능한 경우 사용됩니다.
목차 |
구문
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:
만약
{ int n = 1; label:; int a[n]; // 10번 재할당됨, 각각 다른 크기로 if (n++ < 10) goto label; // VM의 범위를 벗어남 } |
(C99부터) |
키워드
참고 사항
|
선언문은 문(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
문
|