#include "stdafx.h"
int main()
{
int gender; // 성별: 남자 1, 여자 2
int age; // 나이
int isOwner; // 주택 소유 여부: 자가 1, 전월세 0
scanf_s("%d %d %d", &gender, &age, &isOwner);
printf("안녕하세요.\n");
printf("문을 연다.\n");
if (gender == 2)
goto EXIT; // 에러가 발생했으므로 EXIT로 이동
if (age < 30)
goto EXIT; // 에러가 발생했으므로 EXIT로 이동
if (isOwner == 0)
goto EXIT; // 에러가 발생했으므로 EXIT로 이동
EXIT:
printf("안녕히계세요.\n"); // 에러 처리 코드를
printf("문을 닫는다.\n"); // 한 번만 사용함
return 0; // 프로그램 종료
}
안녕하세요
위의 코드대로 Visual Studio 2017에서 실행했는데요,
scanf 입력에 1 40 1 으로 입력해도 EXIT에 해당하는
"안녕히계세요"
"문을 닫는다" 가 같이 뜨고 프로그램이 종료됩니다.
원래대로라면 성별 나이 자가소유가 에러가 아니면,
EXIT에 해당하는 항목도 실행되어야 하지 않아야 하는데
실행이 되니까 궁금합니다.
예외일 때와 정상일 때 모두 종료한다는 가정이므로 EXIT 레이블이 실행됩니다.
레이블이 있다고 해서 해당 레이블로 이동할 때만 실행되는 것은 아닙니다. 레이블 이동(goto EXIT)이 없어도 순차적으로 코드를 실행합니다.
따라서 조건에 맞는 경우에도 인사하고 문을 닫고, 조건에 맞지 않는 경우에도 인사하고 문을 닫습니다.
프로그래밍에서는 보통 함수를 종료하기 전에 사용한 리소스를 반환하기 때문에 이와 같은 방법을 사용합니다. 오류가 발생해도 리소스를 반환하고, 오류가 발생하지 않아도 리소스를 반환해야 합니다. 즉, 종료 시에 리소스 반환이라는 '공통 코드'를 처리하기 위해 EXIT 레이블을 사용했습니다.
예외인 경우에만 처리하고, 정상 처리일 때는 아무 작업도 하고 싶지 않다면 위 코드를 다음과 같이 고치면 됩니다.
return 0; // 프로그램 종료정상일 때는 return으로 종료하고, 에러가 있을 때만 EXIT 레이블을 실행하게 처리를 바꿨습니다.
EXIT:
printf("안녕히계세요.\n"); // 에러 처리 코드를
printf("문을 닫는다.\n"); // 한 번만 사용함
}
이렇게 바꾼 코드를 컴파일해서 테스트해보세요.