2013-04-28 3 views
2

저는 지금 몇 달 동안 C++로 프로그래밍을 해왔고, 포럼을 거치면서 추세를 알아 챘습니다. goto 문은 일반적으로 완전히 잘못 사용 된 것으로 간주되거나 매우 특정한 상황에서만 사용해야합니다. 그것들이 근본적으로 틀리게 만드는 진술은 무엇입니까 goto에 관한 것입니까?goto 문이 C++에서 금기 사항으로 표시되는 이유는 무엇입니까?

+3

[여기] (http://en.wikipedia.org/wiki/Considered_harmful) –

+0

* goto * 문장은 "근본적으로 잘못된"것이 아닙니다 - 최적화 된 어셈블리 코드는 동일한 역할을하는 점프로 가득합니다 목적. 그러나 * goto *는 코드를 인간이 거의 읽을 수 없게 만든다 - 기계에 좋은 것은 인간에게는 그리 좋지 않다. – SChepurin

+0

후토는 1960 년대부터 호의적이지 않았습니다. 그러나 크 누스 (Knuth)와 같은 유명한 작가들도 여전히 그들을 사용합니다. –

답변

7

가장 큰 이유는 코드를 따르기 어렵 기 때문입니다. goto은 암시 적으로 나쁜 것은 아닙니다. 따라하기 힘든 코드를 작성하는 것은 간단합니다.

예를 들어 어떤 것을 읽으시겠습니까? 이 :

int factorial(int n) { 
    int result; 

    if(n==0 || n==1) 
     result = 1; 
    else 
     result = n*factorial(n-1); 

    return result; 
} 

또는이 :

int factorial(int n) { 
    int result; 

    if(n > 1) 
     goto big; 

    result = 1; 
    goto end; 

big: 
    result = n*factorial(n-1); 

end: 
    return result; 
} 

두 구현

은 컴퓨터에 동일하지만, 첫 번째는 우리 인간의 눈에 훨씬 명확하다. 그래도 goto 인 경우가 있습니다. 당신이 한 곳에서 모든 정리 코드를 넣을 수 있기 때문에 goto 말이 사용, 여기에

void process_big_file(FILE* foo) { 
    if(possible_failure_1(foo)) 
     goto cleanup; 

    // Do some work 

    if(possible_failure_2(foo)) 
     goto cleanup; 

    // Do some more work 

cleanup: 
    fclose(foo); 
} 

하고 goto의 사실의 논리적 흐름을 만들 예를 들어, (예외없이 ++ 또는 C) C에서이 고려 실행. 특히 코드를 읽을 때 항상 (a) 정리 코드에 도달하고 (b) 항상 에 동일한 정리 코드가 있어야한다는 점은 중요합니다. 예외가 없으면 클린업 코드를 구성하려고 할 때 goto이 옳다고 주장합니다.

+2

마지막 예제는 C++에서 사용해서는 안됩니다. 예외가 없어도 오류 코드/조기 반환과 함께 작동하는 RAII가 항상 있습니다. – Pubby

+0

원칙적으로 나는 동의하지만 때때로 RAII는 적합하지 않습니다. 그런 경우에는 좋은 오래된 포인터 (RAII를 구현할 'auto_ptr'조차도 필요 없다)가 필요하다. 그런 다음 수동으로 정리해야한다. 좋은 예는 RAII 형 객체와'auto_ptr' 둘 다 객체 라이프 사이클 또는 (b) 참조 카운팅 (각각)을 사용하여 순환을 수행하기 때문에 원형 참조가있는 객체 그래프입니다. 그리고 물론, 때로는 레거시 C 코드에 꽂기 만하면 모든 지옥이 느슨해집니다. :) – sigpwned

+0

@sigpwned 마지막 예제는 기능이 너무 많이 수행되고있는 잘못 설계된 코드의 완벽한 예입니다. –

0

주된 이유는 goto은 코드에 대한 추론을 불가능하지는 않지만 매우 어렵게 만듭니다. (루프의 중간에서 나가기 위해 break을 사용하는 것과 같은 "숨겨진"goto의 경우에도 마찬가지입니다.) 일반적으로 코드의 정확성을 추론 할 수있게하려면 각 블록을 입력해야합니다 상단에, 그리고 그것을 하단에 둡니다. 그리고 코드의 정확성을 추론 할 수 없으면 올바른 코드인지 확신 할 수 없습니다.

+0

내가 본 주제에 대한 가장 좋은 설명. – SChepurin