C ++ 코드를 종료하는 방법


267

특정 조건이 충족되면 C ++ 코드 실행을 중지하고 싶지만 어떻게 해야할지 모르겠습니다. 따라서 if명령문이 참이면 언제든지 다음과 같이 코드를 종료하십시오.

if (x==1)
{
    kill code;
}

98
적절한 논리를 사용하십시오. 에서는 main()사용 회수, 기능에 적절한 리턴 값을 사용하거나 적절한 예외를 발생. 하지 마십시오 사용 exit()!
kay-SE는 악하다

6
@JonathanLeffler : NDEBUG정의 된 상태로 컴파일 될 때 assert, 아무 문제가 없을 것이므로 디 텍팅 버그 이상의 것에 의존해서는 안됩니다.
MvG

13
@ jamesqf : returnfrom main()은 완벽하게 논리적입니다. 프로그램이보고 한 종료 코드를 운영 체제에 설정하는데, 이는 많은 경우에 유용 할 수 있습니다 (예를 들어, 프로그램이 더 큰 프로세스의 일부로 사용될 수있는 경우).
AAT

11
흥미롭게 도이 Q는 5 년 전의 복제본이며, 그 대답은 상당히 다릅니다 : stackoverflow.com/questions/1116493/how-to-quit-ac-program 나는 맹목적으로 그것을 배우는 데 5 년이 걸렸다 고 생각합니다 std :: exit를 호출하면 나쁠 수 있습니까?
Brandin

5
질문 사용이 exit()나쁜 것으로 간주됩니까? – SO 25141737C ++ 프로그램을 종료하는 방법? – 이제 SO 1116493이이 복제본으로 닫힙니다. 그 중 첫 번째는 강력한 소프트웨어 작성 방법에 대한 생각을 자극하기 만하면 '충돌 전용 소프트웨어'에 대한 참조가 필요합니다.
Jonathan Leffler

답변:


431

몇 가지 방법이 있지만 먼저 객체 정리가 중요한 이유를 이해해야하므로 std::exitC ++ 프로그래머들 사이에서 그 이유 가 소외됩니다.

RAII 및 스택 풀기

C ++은 RAII 라는 관용구를 사용하는데 , 이는 간단히 말해서 객체가 생성자에서 초기화를 수행하고 소멸자에서 정리해야 함을 의미합니다. 예를 들어 std::ofstream클래스는 생성자 중에 파일을 열 수 있고, 사용자는 그 파일에 대해 출력 작업을 수행하고 마지막으로 수명주기의 끝에서 일반적으로 해당 범위에 따라 결정되며 소멸자는 본질적으로 파일을 닫고 플러시합니다. 디스크에 기록 된 내용

소멸자가 파일을 플러시하고 닫지 않으면 어떻게됩니까? 누가 알아! 그러나 파일에 쓰려고했던 모든 데이터를 쓰지 못할 수도 있습니다.

예를 들어이 코드를 고려하십시오

#include <fstream>
#include <exception>
#include <memory>

void inner_mad()
{
    throw std::exception();
}

void mad()
{
    auto ptr = std::make_unique<int>();
    inner_mad();
}

int main()
{
    std::ofstream os("file.txt");
    os << "Content!!!";

    int possibility = /* either 1, 2, 3 or 4 */;

    if(possibility == 1)
        return 0;
    else if(possibility == 2)
        throw std::exception();
    else if(possibility == 3)
        mad();
    else if(possibility == 4)
        exit(0);
}

각 가능성에서 일어나는 일은 :

  • 가능성 1 : 리턴은 본질적으로 현재 기능 범위를 os벗어나므로 소멸자를 호출하고 파일을 디스크로 플러시하여 적절한 정리를 수행 하는 수명주기의 끝에 대해 ​​알고 있습니다.
  • 가능성 2 : 예외를 던지면 현재 범위에있는 개체의 수명 주기도 관리하므로 적절한 정리가 수행됩니다.
  • 가능성 3 : 스택 풀기 작업이 시작됩니다! 예외가 던져하더라도 inner_mad, 언 와인 더가의 스택 불구하고 갈 것입니다 madmain적절한 정리를 수행하는 모든 객체를 포함하여, 적절하게 파괴 될거야 ptr하고 os.
  • 가능성 4 : 여기 요? exitC 함수이며 C ++ 숙어를 인식하거나 호환하지 않습니다. 그것은 하지 않습니다 포함하여 개체에 대한 정리를 수행 os매우 동일한 범위에. 따라서 파일이 제대로 닫히지 않기 때문에 내용이 파일에 쓰여지지 않을 수 있습니다!
  • 기타 가능성 : 암시 적 수행을 통해 return 0가능성 1과 동일한 효과, 즉 적절한 정리와 같은 방식으로 주요 범위를 벗어나게 됩니다.

그러나 내가 방금 말한 것에 대해 확신하지 마십시오 (주로 가능성 2와 3). 계속 읽고 우리는 적절한 예외 기반 정리를 수행하는 방법을 알아낼 것입니다.

가능한 방법으로 종료

메인에서 돌아온다!

가능할 때마다이 작업을 수행해야합니다. 항상 메인에서 적절한 종료 상태를 반환하여 프로그램에서 돌아 오는 것을 선호합니다.

프로그램 호출자와 운영 체제는 프로그램이 수행해야 할 작업이 성공적으로 수행되었는지 여부를 알고 싶어 할 수 있습니다. 이와 같은 이유로 0을 반환하거나 EXIT_SUCCESS프로그램이 성공적으로 종료 되었음을 알리고 프로그램이 성공적으로 종료되었다는 신호를 EXIT_FAILURE보내려면 다른 형태의 반환 값이 구현 정의되어 있습니다 ( §18.5 / 8 ).

그러나 당신은 호출 스택에 매우 깊이있을 수 있으며, 그것을 모두 반환하는 것은 고통 스러울 수 있습니다 ...

[예외] 예외를 던져

예외를 던지면 이전 범위에서 모든 객체의 소멸자를 호출하여 스택 해제를 사용하여 적절한 객체 정리를 수행합니다.

그러나 여기 에 캐치가 있습니다 ! throw 된 예외가 처리되지 않을 때 (catch (...) 절noexcept 에 의해) 호출 스택의 중간에 함수 가있는 경우에도 스택 해제가 수행되는지 여부가 구현에서 정의됩니다 . 이것은 §15.5.1에 명시되어 있다 .

  1. 미묘한 오류 처리 기술을 줄이려면 예외 처리를 포기해야하는 경우도 있습니다. [참고 : 이러한 상황은 다음과 같습니다.

    [...]

    예외 처리 메커니즘이 발생 된 예외 (15.3)에 대한 처리기를 찾을 수 없거나 처리기 검색 (15.3)noexcept 에서 예외를 허용하지 않는 -사양가진 함수의 가장 바깥 쪽 블록이 발견 될 때 (15.4) [...]

    [...]

  2. 이러한 경우 std :: terminate ()가 (18.8.3)이라고합니다. 일치하는 핸들러가없는 경우 std :: terminate ()가 호출되기 전에 스택이 풀리는 지 여부는 구현에서 정의됩니다. [...]

그래서 우리는 그것을 잡아야합니다!

예외를 던져서 메인에서 잡아라!

잡히지 않은 예외는 스택 해제를 수행하지 않을 수 있고 (따라서 적절한 정리를 수행 하지 않을 수 있기 때문에 ) 메인에서 예외를 포착 한 다음 종료 상태 ( EXIT_SUCCESS또는 EXIT_FAILURE) 를 반환해야합니다 .

따라서 좋은 설정은 다음과 같습니다.

int main()
{
    /* ... */
    try
    {
        // Insert code that will return by throwing a exception.
    }
    catch(const std::exception&)  // Consider using a custom exception type for intentional
    {                             // throws. A good idea might be a `return_exception`.
        return EXIT_FAILURE;
    }
    /* ... */
}

[하지 마십시오] std :: exit

이것은 어떤 종류의 스택 해제도 수행하지 않으며 스택의 살아있는 객체는 해당 소멸자를 호출하여 정리를 수행하지 않습니다.

이것은 §3.6.1 / 4 [basic.start.init] 에서 시행됩니다 .

현재 블록을 떠나지 않고 프로그램을 종료하면 (예 : std :: exit (int) (18.5) 함수를 호출하여) 자동 저장 기간 (12.4)이있는 객체는 파괴되지 않습니다 . 정적 또는 스레드 저장 기간을 가진 오브젝트를 소멸하는 동안 프로그램을 종료하기 위해 std :: exit를 호출하면 프로그램에 정의되지 않은 동작이 있습니다.

지금 생각해보십시오. 왜 그런 일을 하시겠습니까? 고통스럽게 몇 개의 물건을 손상 시켰습니까?

다른 [나쁜] 대안

프로그램을 종료하는 다른 방법 (충돌 이외) 이 있지만 권장되지는 않습니다. 설명을 위해 여기에 제시 할 것입니다. 공지 사항 어떻게 정상적인 프로그램 종료가 되지 않습니다 평균 스택 풀기하지만, 괜찮 운영 체제 상태.

  • std::_Exit 정상적인 프로그램 종료를 유발합니다.
  • std::quick_exit정상적인 프로그램 종료를 유발하고 std::at_quick_exit핸들러를 호출 하며 다른 정리는 수행되지 않습니다.
  • std::exit정상적인 프로그램 종료를 std::atexit일으킨 다음 핸들러 를 호출합니다 . 정적 객체 소멸자를 호출하는 것과 같은 다른 종류의 정리가 수행됩니다.
  • std::abort프로그램이 비정상적으로 종료되고 정리가 수행되지 않습니다. 프로그램이 실제로 예상치 못한 방식으로 종료 된 경우 호출해야합니다. 비정상 종료에 대해 OS에 신호를 보내는 것 외에는 아무것도하지 않습니다. 이 경우 일부 시스템은 코어 덤프를 수행합니다.
  • std::terminate기본적으로 std::terminate_handler어떤 호출 std::abort을 호출합니다 .

25
이것은 매우 유익합니다. 특히 어디서나 처리되지 않은 예외를 던지면 (예 : 일부 new던지기 std::bad_alloc및 프로그램이 예외를 잡는 것을 잊어 버린 경우) 종료하기 전에 스택을 제대로 풀지 못할 것이라는 것을 결코 알지 못했습니다 . 이것은 나에게 바보 같다 : 그것은에 전화를 포장 본질적으로 쉬웠을 것입니다 main사소한에 try{- }catch(...){}(비용없이 제대로, 이러한 경우에 이루어집니다 스택 언 와인딩을 보장 할 블록에있는 I 평균이를 사용하는 프로그램 여부를 지불 할 것없이 패널티). 이것이 수행되지 않은 특별한 이유가 있습니까?
Marc van Leeuwen

12
@MarcvanLeeuwen 가능한 이유 중 하나는 디버깅입니다. 처리되지 않은 예외가 발생하자마자 디버거에 침입하려고합니다. 스택을 풀고 정리하면 디버깅하려는 충돌의 원인이되는 컨텍스트가 지워집니다. 디버거가 없으면 사후 분석을 수행 할 수 있도록 코어를 덤프하는 것이 좋습니다.
휴 앨런

11
때로는 브라우저에서 버그가 발생하고 (플래시를 비난합니다) 몇 기가 바이트의 RAM을 소비하고 OS는 하드 드라이브의 페이지를 덤프하여 모든 것을 느리게 만듭니다. 브라우저를 닫으면 적절한 스택 해제가 수행됩니다. 즉, 모든 기가 바이트의 RAM을 하드 드라이브에서 읽은 다음 메모리에 복사하면 해제됩니다 .1 분 정도 걸립니다. 나는 그들이 std::abort대신 사용 하여 OS가 1 분 동안 스왑하지 않고 모든 메모리, 소켓 및 파일 설명자를 해제 할 수 있기를 바랍니다 .
nwp

2
@nwp, 나는 느낌을 이해한다. 그러나 즉시 죽이면 파일이 손상되고 가장 최근의 탭 등을 저장하지 않을 수 있습니다 :)
Paul Draper

2
@PaulDraper 필자는 브라우저가 정전 전에 열었던 탭을 복원 할 수 없다면 확실히 용납 할 수 없다고 생각합니다. 물론 탭을 열 었으나 아직 저장할 시간이 없다면 손실 될 것입니다. 그러나 그 외에는 그것을 잃을 이유가 없다고 말합니다.
kasperd

61

Martin York이 언급했듯이 exit는 return과 같이 필요한 정리를 수행하지 않습니다.

출구 대신에 return을 사용하는 것이 좋습니다. 메인에 있지 않은 경우 프로그램을 종료하려는 위치에서 메인으로 먼저 돌아가십시오.

아래 예를 고려하십시오. 다음 프로그램을 사용하면 언급 된 내용으로 파일이 작성됩니다. 그러나 return이 주석 처리되고 주석 처리되지 않은 exit (0)이면 컴파일러는 파일에 필요한 텍스트가 있는지 확인하지 않습니다.

int main()
{
    ofstream os("out.txt");
    os << "Hello, Can you see me!\n";
    return(0);
    //exit(0);
}

이뿐 만 아니라 프로그램에 여러 개의 종료 점이 있으면 디버깅이 더 어려워집니다. 정당화 될 수있는 경우에만 exit를 사용하십시오.


2
조금 더 큰 프로그램에서이 동작을 달성하기 위해 권장하는 것은 무엇입니까? 코드에서 더 깊은 곳에서 프로그램을 종료 해야하는 오류 조건이 발생하면 어떻게 항상 메인으로 깨끗하게 돌아갈 수 있습니까?
Janusz

5
@Janusz,이 경우 미리 정의 된 값을 반환하지 않는 경우 (예 : 성공하면 0 반환, 실패한 경우 1 반환) 실행을 계속하는 경우 예외를 사용하거나 throw 할 수 있습니다. 실패한 경우 -1하고 프로그램을 종료하십시오. 함수의 반환 값을 기준으로 실패하면 더 많은 정리 활동을 수행 한 후 메인에서 반환합니다. 마지막으로, exit를 신중하게 사용하십시오. 나는 그것을 피하는 것을 의미하지 않습니다.
Narendra N

1
@NarendraN, "필요한 정리"는 애매 모호합니다. OS는 메모리와 파일 핸들이 올바르게 해제되도록주의를 기울입니다 (Windows / Linux). "누락 된"파일 출력 :이 문제가 실제 문제 일 수 있다고 주장하는 경우 stackoverflow.com/questions/14105650/how-does-stdflush-work를 참조하십시오 . 오류 상태 인 경우 적절한 로깅을 통해 프로그램에 알립니다 정의되지 않은 상태에 도달하면 로깅 지점 바로 전에 중단 점을 설정할 수 있습니다. 그러면 디버깅이 어려워 집니까?
Markus

2
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler

현대적인 C ++ 사용 return (EXIT_SUCCESS);대신return(0)
Jonas Stein

39

std::exit함수를 호출하십시오 .   


2
해당 함수를 호출 할 때 어떤 객체의 소멸자가 호출됩니까?
Rob Kennedy

37
exit ()가 반환되지 않습니다. 따라서 스택 풀기가 발생하지 않습니다. 전역 객체조차도 파괴되지 않습니다. 그러나 atexit ()에 등록 된 함수가 호출됩니다.
Martin York

16
exit()호스트 코드 내에서 라이브러리 코드가 실행 중일 때는 호출하지 마십시오 . 후자는 중간에 종료됩니다.
sharptooth

5
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler

23

사람들은 "호출 종료 (반환 코드)"라고 말하지만 이것은 잘못된 형식입니다. 작은 프로그램에서는 문제가 없지만 다음과 같은 여러 가지 문제가 있습니다.

  1. 프로그램에서 여러 개의 종료 점이 생깁니다.
  2. 코드를 더 복잡하게 만듭니다 (goto를 사용하는 것처럼)
  3. 런타임에 할당 된 메모리를 해제 할 수 없습니다

실제로 문제를 끝내야 할 유일한 시간은 main.cpp의 다음 줄입니다.

return 0;

exit ()를 사용하여 오류를 처리하는 경우 훨씬 더 우아하고 안전한 방법으로 예외 (및 중첩 예외)에 대해 학습해야합니다.


9
다중 스레드 환경에서 main ()을 통해 다른 스레드에서 발생한 예외는 처리되지 않습니다. 하위 스레드가 만료되기 전에 일부 수동 교차 스레드 통신이 필요합니다.
Steve Gilham

3
1과 2는 프로그래머에게 달려 있으며, 적절한 로깅으로 실행이 영원히 중지되므로 문제가되지 않습니다. 3 : 그것은 명백한 잘못입니다 .OS는 메모리를 비울 것입니다-아마도 임베디드 장치 / 실시간을 제외하고 있지만, 당신이하고 있다면 아마 당신의 것을 알 것입니다.
Markus

1
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler

1
그러나 오류가 발생하면 0을 반환하지 않아야합니다. 1을 반환해야합니다 (또는 다른 값이지만 1이 항상 안전한 선택 임).
Kef Schecter

14

return 0;원하는 곳에 넣으면 int main()프로그램이 즉시 닫힙니다.


the-nightman, @ evan-carslake 및 다른 모든 사람들은 또한이 SO 질문 # 36707 이 반환 문이 일상의 어느 곳에서나 발생 해야하는지에 대한 토론을 제공 한다고 덧붙 입니다. 이것은 해결책입니다. 그러나 특정 상황에 따라 이것이 최선의 해결책이라고는 말할 수 없습니다.
localhost

1
OP는 이것에 대해 아무 말도하지 않았으므로 코드가 함수 내부에 있다고 가정하는 것이 오히려 발진이라고 생각합니다 main.
Marc van Leeuwen

@localhost 어떤 상황에서도 모든 상황에서 return 문은 완전히 선택 사항입니다. 그러나 int main()다릅니다. 프로그램은 int main()시작과 종료에 사용 됩니다. 다른 방법은 없습니다. true 또는 false를 반환 할 때까지 프로그램이 실행됩니다. 거의 항상 1 또는 true를 리턴하여 프로그램이 올바르게 닫 혔음을 표시합니다 (예 : 메모리를 확보 할 수 없거나 다른 이유가있는 경우 false를 사용할 수 있음). 프로그램 자체를 완료하는 것은 항상 나쁜 생각입니다.int main() { int x = 2; int foo = x*5; std::cout << "blah"; }
Evan Carslake

@EvanCarslake 이해,이 질문에 대해 다른 곳에 게시 한 의견을 발견하면 이에 대해 잘 알고 있습니다 int main. 그러나 기본 루틴에 여러 개의 return 문이있는 것이 항상 좋은 생각은 아닙니다. 하나의 잠재적 인 경고는 코드 가독성을 향상시키는 것입니다. 그러나 코드의 특정 코드 섹션이 해당 애플리케이션 상태에서 실행되지 않도록 상태를 변경하는 부울 플래그와 같은 것을 사용합니다. 개인적으로, 일반적인 반환 진술은 대부분의 응용 프로그램을 더 읽기 쉽게 만듭니다. 마지막으로, 종료 전에 메모리 정리 및 I / O 개체 닫기에 대한 질문입니다.
localhost

2
당신은 반환하지 않습니다 @EvanCarslake true에서 main올바른 종료를 나타냅니다. 정상적인 종료를 나타내 EXIT_SUCCESS려면 0 또는 원하는 false경우을 암시 적으로 0으로 변환해야합니다. 실패를 나타내려면를 반환 할 수 있습니다 EXIT_FAILURE. 다른 코드 의미는 구현에 따라 정의됩니다 (POSIX 시스템에서는 실제 오류 코드를 의미 함).
Ruslan

11

실행 흐름이 메인 기능의 끝에 도달하면 프로그램이 종료됩니다.

그 전에 종료하려면 exit (int status) 함수를 사용할 수 있습니다. 여기서 status는 프로그램을 시작한 모든 값으로 리턴되는 값입니다. 0은 일반적으로 오류가 아닌 상태를 나타냅니다.


2
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler

11

값을 반환 main하거나 exit함수를 사용하십시오 . 둘 다 정수를 취합니다. 외부 프로세스에서 반환 값을 감시하지 않는 한 반환하는 값은 중요하지 않습니다.


3
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler


9

일반적으로 exit()적절한 종료 상태로 메소드를 사용합니다 .

0은 성공적인 실행을 의미합니다. 0이 아닌 상태는 일종의 문제가 발생했음을 나타냅니다. 이 종료 코드는 상위 프로세스 (예 : 셸 스크립트)에서 프로세스가 성공적으로 실행되었는지 확인하는 데 사용됩니다.


1
종료를 사용하면 디자인 문제가 있음을 의미 할 수 있습니다. 프로그램이 제대로 작동하면 main 때 종료해야합니다 return 0;. 나는 가정 exit()처럼을 assert(false);하고 일찍 캐치 문제에 개발에만 사용해야합니다.
CoffeDeveloper

2
이 답변은 C ++ 프로그램을 종료하는 방법 이라는 질문에서 병합되었습니다 . – SO 1116493 . 이 답변은이 질문을하기 약 6 년 전에 작성되었습니다.
Jonathan Leffler

7

atexit 핸들러를 호출하지만 RAII 소멸자 등을 호출하지 않는 exit (error_code) 호출 외에도 점점 더 많은 예외를 사용하고 있습니다.

점점 더 내 주요 프로그램은 다음과 같습니다

int main(int argc, char** argv) 
{
    try {
        exit( secondary_main(argc, argv );
    }
    catch(...) {
        // optionally, print something like "unexpected or unknown exception caught by main"
        exit(1);
    }
}

여기서 secondary_main은 원래 모든 재료를 넣는 위치에 있습니다. 즉, 원래 메인의 이름이 secondary_main으로 바뀌고 위의 스텁 메인이 추가됩니다. 트레이와 캐치 사이에 코드가 너무 많지 않기 때문에 이것은 멋지다.

원하는 경우 다른 예외 유형을 포착하십시오.
std :: string 또는 char *와 같은 문자열 오류 유형을 포착하고 main의 catch 핸들러에서 인쇄하는 것을 좋아합니다.

이와 같은 예외를 사용하면 RAII 소멸자를 호출하여 정리할 수 있습니다. 쾌적하고 유용 할 수 있습니다.

전반적으로 C 오류 처리 (종료 및 신호) 및 C ++ 오류 처리 (시도 / 캐치 / 투척 예외)는 일관되지 않게 함께 재생됩니다.

그런 다음 오류를 발견 한 곳

throw "error message"

또는 좀 더 구체적인 예외 유형.


그건 그렇고 : 동적 메모리 할당이 필요할 수있는 문자열과 같은 데이터 유형을 사용하는 것은 메모리 부족과 관련된 예외에 대한 예외 처리기 내부 또는 주변에서 좋은 생각이 아니라는 것을 잘 알고 있습니다. C 스타일 문자열 상수는 문제가되지 않습니다.
Krazy Glew

1
exit프로그램 을 호출 할 필요 는 없습니다 . 에 있기 때문에 할 main수 있습니다 return exitCode;.
Ruslan

-1

if 문이 루프에 있으면 사용할 수 있습니다

 break; 

일부 코드를 이스케이프하고 루프를 계속 사용하려면 다음을 사용하십시오.

계속하다;

if 문이 루프에 없으면 다음을 사용할 수 있습니다.

 return 0;

Or 




  exit();

-2

Dude ... exit()함수는 stdlib.h에 정의되어 있습니다.

따라서 전처리기를 추가해야합니다.

include stdlib.h헤더 섹션에 넣 습니다

그런 다음 exit();원하는 곳을 사용 하되 출구의 괄호 안에 interger 번호를 입력하십시오.

예를 들면 다음과 같습니다.

exit(0);

-2

테스트하려는 조건이 정말 나쁜 소식이라면 다음과 같이하십시오.

*(int*) NULL= 0;

이것은 내가 상황을 조사 할 수있는 멋진 코어 덤프를 제공합니다.


4
정의되지 않은 동작이 발생하기 때문에 최적화가 잘 될 수 있습니다. 실제로, 그러한 명령문을 갖는 실행의 전체 분기는 컴파일러에 의해 제거 될 수 있습니다.
Ruslan

-2

조건을 어기려면 return (0)을 사용하십시오.

따라서 귀하의 경우 다음과 같습니다.

    if(x==1)
    {
        return 0;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.