소년코딩

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 문은 거의 사용하지 않는다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/54-goto-statements/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기