goto
statement
| General topics | ||||||||||||||||
| Flow control | ||||||||||||||||
| Conditional execution statements | ||||||||||||||||
| Iteration statements (loops) | ||||||||||||||||
|
||||||||||||||||
| Jump statements | ||||||||||||||||
|
||||||||||||||||
| Functions | ||||||||||||||||
| Function declaration | ||||||||||||||||
| Lambda function expression | ||||||||||||||||
inline
specifier
|
||||||||||||||||
| Dynamic exception specifications ( until C++17* ) | ||||||||||||||||
noexcept
specifier
(C++11)
|
||||||||||||||||
| Exceptions | ||||||||||||||||
| Namespaces | ||||||||||||||||
| Types | ||||||||||||||||
| Specifiers | ||||||||||||||||
|
||||||||||||||||
| Storage duration specifiers | ||||||||||||||||
| Initialization | ||||||||||||||||
| Expressions | ||||||||||||||||
| Alternative representations | ||||||||||||||||
| Literals | ||||||||||||||||
| Boolean - Integer - Floating-point | ||||||||||||||||
| Character - String - nullptr (C++11) | ||||||||||||||||
| User-defined (C++11) | ||||||||||||||||
| Utilities | ||||||||||||||||
| Attributes (C++11) | ||||||||||||||||
| Types | ||||||||||||||||
typedef
declaration
|
||||||||||||||||
| Type alias declaration (C++11) | ||||||||||||||||
| Casts | ||||||||||||||||
| Memory allocation | ||||||||||||||||
| Classes | ||||||||||||||||
| Class-specific function properties | ||||||||||||||||
|
||||||||||||||||
| Special member functions | ||||||||||||||||
|
||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
무조건적으로 제어를 전달합니다.
다른 문장을 사용하여 원하는 위치로 제어를 전달하는 것이 불가능할 때 사용됩니다.
목차 |
구문
attr
(선택 사항)
goto
label
;
|
|||||||||
설명
goto 문은 label 이 지정한 위치로 제어를 전달합니다. goto 문은 참조하는 label 과 동일한 함수 내에 있어야 하며, label 앞이나 뒤에 나타날 수 있습니다.
제어의 전송이 자동 변수들의 범위를 벗어나는 경우(예: 이러한 변수들의 선언 이전 시점으로 역방향 점프하거나 변수들이 범위에 있는 복합문을 벗어나도록 순방향 점프하는 경우), 범위를 벗어난 모든 변수들에 대해 소멸자들이 호출되며, 이는 생성 순서의 역순으로 이루어집니다.
goto 문은 제어 흐름 제한 문 안으로 제어를 전달할 수 없지만, 제어 흐름 제한 문 밖으로 제어를 전달할 수 있습니다(위에서 언급된 범위 내 자동 변수에 관한 규칙이 적용됩니다).
제어의 전달이 자동 변수의 범위 내로 진입하는 경우(예: 선언문을 앞으로 건너뛰는 점프), 프로그램은 형식에 맞지 않습니다(컴파일할 수 없음). 단, 범위 내로 진입하는 모든 변수가 다음 유형을 갖는 경우는 예외입니다:
- 초기화 없이 선언된 스칼라 타입
- 초기화 없이 선언된 trivial 기본 생성자와 trivial 소멸자를 가진 클래스 타입
- 위 항목 중 하나의 cv-qualified 버전
- 위 항목 중 하나의 배열
(참고: 동일한 규칙이 모든 제어 전달 형태에 적용됩니다)
참고 사항
C 프로그래밍 언어에서 goto 문은 더 적은 제한을 가지며 가변 길이 배열 또는 가변 수정 포인터를 제외한 모든 변수의 범위에 진입할 수 있습니다.
키워드
예제
#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; // goto를 사용한 루프 label: Object obj; std::cout << a << ' '; a -= 2; if (a != 0) goto label; // obj의 범위를 벗어나 점프, obj 소멸자 호출 std::cout << '\n'; // goto는 다중(중첩) 루프를 효율적으로 벗어나는 데 사용 가능 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; // n과 t의 범위로 점프 [[maybe_unused]] int n; // 초기화 없음 [[maybe_unused]] Trivial t; // trivial 생성자/소멸자, 초기화 없음 // int x = 1; // 오류: 초기화자가 있음 // Object obj2; // 오류: non-trivial 소멸자 label2: { Object obj3; goto label3; // 앞으로 점프, 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
|
외부 링크
|
유명한 에츠허르 W. 다익스트라의 에세이, "Goto Considered Harmful" (원본: "Letter to Communications of the ACM (CACM)", vol. 11 #3, March 1968, pp. 147-148.)는 이 키워드를 부주의하게 사용할 때 발생할 수 있는 다양한 미묘한 문제들에 대한 검토를 제시합니다. |