Programing

goto를 사용하면 어떤 문제가 있습니까?

crosscheck 2020. 8. 19. 07:36
반응형

goto를 사용하면 어떤 문제가 있습니까? [복제]


중복 가능성 :
goto를 사용하는 것이 왜 나쁜가요?
GOTO는 여전히 유해하다고 간주됩니까?

나는 xkcd를 샅샅이 뒤져서 이것을 보았다 (몇 년 전에 그들에 대한 부정적인 텍스트를 읽었다면) :
느린 연결 상태가 좋지 않습니다.이 이미지를 보려면 더 빠르게 연결하세요.
실제로 무엇이 문제입니까? 왜 C ++에서도 goto가 가능합니까?

사용 하지 말아야 합니까?


스파게티 코드로 이어지기 때문 입니다.

과거에는 프로그래밍 언어에 while 루프, if 문 등이 없었으며 프로그래머는 프로그램의 논리를 구성하기 위해 goto를 사용했습니다. 유지 관리 할 수없는 혼란으로 이어집니다.

이것이 CS 신이 메서드, 조건부 및 루프를 만든 이유입니다. 구조화 된 프로그래밍은 당시 혁명이었습니다.

goto는 중첩 된 루프에서 뛰어 내리는 것과 같은 몇 가지 위치에 적합합니다.


goto제대로 사용하면 아무 문제가 없습니다 . 이것이 "금기"인 이유는 C 초기에는 프로그래머 (종종 어셈블리 배경에서 온)가 goto믿을 수 없을 정도로 이해하기 어려운 코드를 만드는 데 사용 하기 때문입니다.

대부분의 경우, 당신은없이 살 수 goto있고 괜찮습니다. 그러나 goto유용한 경우가 몇 가지 있습니다. 가장 좋은 예는 다음과 같은 경우입니다.

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
            ...
            if (condition)
                goto break_out;
            ....
        }
    }
}
break_out:

를 사용하여 goto깊게 중첩 된 루프에서 뛰어 내리는 것이 조건 변수를 사용하고 모든 수준에서 확인하는 것보다 더 깔끔 할 수 있습니다.

goto서브 루틴을 구현하는 데 사용 하는 것이 악용되는 주요 방법입니다. 이것은 불필요하게 읽고 유지하기 어려운 소위 "스파게티 코드"를 생성합니다.


goto 자체에는 문제가 없습니다. 프로그래밍에서 매우 유용한 구조이며 많은 유효한 용도가 있습니다. 떠오르는 가장 좋은 점은 C 프로그램에서 구조화 된 리소스 해제입니다.

goto가 잘못되는 곳은 학대를 당할 때입니다. gotos를 남용하면 코드를 완전히 읽을 수없고 유지 관리 할 수 ​​없게 될 수 있습니다.


1968 년 Edsger DijkstraACM GOTOCommunications 편집자에게 유명한 편지를 썼는데, 그는 while 루프if ... then ... else 조건문을 사용 하여 구조화 된 프로그래밍에 대한 사례를 제시 한 유해한 것으로 간주 됩니다. GOTO를 사용하여 이러한 제어 구조를 대체하면 결과는 매우 자주 스파게티 코드 입니다. 오늘날 사용되는 거의 모든 프로그래밍 언어는 구조화 된 프로그래밍 언어이며 GOTO의 사용은 거의 제거되었습니다. 실제로 Java, Scala, Ruby 및 Python에는 goto명령 이 전혀 없습니다 .

C, C ++ 및 Perl에는 여전히 GOTO 명령이 있으며, GOTO가 유용한 상황 (특히 C에서)이 있습니다. 예를 들어 여러 루프를 종료하는 break 문이나 정리 코드를 단일 위치에 집중하는 방법으로 함수를 종료하는 여러 방법이있는 경우에도 함수 (예 : 함수 진행 중 여러 지점에서 오류 코드를 반환). 그러나 일반적으로 그 사용은 통제되고 인식되는 방식으로 요구되는 특정 디자인 패턴으로 제한되어야합니다.

(C ++에서는 정리를 위해 GOTO를 사용하는 대신 RAII 또는 ScopeGuard (more) 를 사용하는 것이 좋습니다. 그러나 GOTO는 관용적 C 코드의 좋은 예인 Linux 커널 ( 다른 소스 ) 에서 자주 사용되는 관용구입니다 .)

XKCD 코믹은 "GOTO를 사용함으로써 크게 도움이되는 특정 디자인 패턴이있을 때 항상 유해한 것으로 간주되어야합니까?"라는 질문에 대한 농담입니다.


문제를 Google에 검색 했습니까?

반 고토 운동의 창시자는 그의 전설적인 "고토가 유해한 것으로 간주 됨"과 함께 Edsger Dijskstra입니다.

시작하려면 (하하!) http://en.wikipedia.org/wiki/GOTO로 이동하세요.


그것은 C에서 가능하기 때문에 C ++에서 가능합니다. 당신이 그것을 사용해야하는지 말아야하는지 여부는 오랜 종교 전쟁입니다.

참고 URL : https://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto

반응형