06.03 - goto 문 (goto statement)
goto 문은 CPU가 코드의 다른 지점으로 점프하도록 하는 제어 흐름 명령문이다. 점프하는 지점은 문 라벨(statement label) :
을 사용하여 식별된다. 다음은 goto
문과 문 라벨의 예다.
#include <iostream>
#include <cmath> // for sqrt() function
int main()
{
double x;
tryAgain: // this is a statement label
std::cout << "Enter a non-negative number";
std::cin >> x;
if (x < 0.0)
goto tryAgain; // this is the goto statement
std::cout << "The sqrt of " << x << " is " << sqrt(x) << std::endl;
return 0;
}
이 프로그램에서는 음수가 아닌 숫자를 입력하라는 메시지가 출력된다. 하지만 만약 음수를 입력하면 프로그램은 goto
문을 사용하여 tryAgain:
라벨로 다시 이동한다. 그런 다음 새 숫자를 입력하라는 메시지가 다시 출력된다. 이러한 방식으로, 사용자가 유효한 숫자를 입력할 때까지 계속해서 입력을 요구할 수 있다.
변수 포스트에서 지역(블록) 범위, 파일 범위 및 전역 범위 등 세 가지 범위를 다루었다. 문 라벨(statement label)은 네 번째 종류의 범위, 즉 기능 범위를 이용한다. goto
문과 해당 문 라벨(statement label)은 같은 함수에 나타나야 한다.
goto
문 사용에 대한 몇 가지 제한이 있다. 예를 들어, goto
와 동일한 블록에서 초기화된 변수 앞으로 건너뛸 수 없다.
int main()
{
goto skip; // invalid forward jump
int x = 5;
skip:
x += 3; // what would this even evaluate to?
return 0;
}
일반적으로 goto의 사용은 C++에서 해로운 것으로 간주한다. 프로그래머가 실행 지점을 임으로 뛰어넘을 수 있게 하는 이 기능은 스파게티 코드를 만든다.
스파게티 코드는 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현이다. 스파게티 코드는 작동은 정상적으로 하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기는 어렵다.
goto
문은 Basic이나 Fortran과 같은 일부 오래된 언어에서 흔하고 심지어 C 언어에서도 사용된다. 그러나 goto
문을 사용하여 작성된 거의 모든 코드는 루프, 예외 처리와 같은 C++의 다른 문법을 사용하여 더 명확하게 작성할 수 있으므로 C++에서 goto
문은 거의 사용하지 않는다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/54-goto-statements/ 입니다.