궁금증 연구소

안녕하세요. 궁금증연구소 입니다.

오늘 포스팅 주제는 "goto label 활용법" 입니다.

소스코드 출처는 MIT의 C, C++ 오픈코스 강좌의 PDF 파일을 활용했습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void foo(void);

main()
{
    foo();
}

void foo(void){
        for (int i =0; i<10; i++){
            printf("%d", i);
            if (i ==2){
                i =3;
                continue;
            }else if(i ==6){
                break;
            }
        }
        end:
        printf("the end\n");
        return;
        goto end;
        printf("near the end\n");
        return;
        printf("or is it?");
    }

코드를 점프하는 코드는 주로 continue, break, goto, return 을 생각해 볼 수 있습니다.

 

첫번째 점프

코드의 첫번째 점프는 continue에서 나옵니다. continue는 하단에 나온 코드 실행을 무시하고, ++i로 바로 진행됩니다.

즉, 위 코드에서 i가 3일때 값은 출력이 되지 않겠죠.

 

 

 

 

 

두번째 점프

두번째 점프는 break에 나옵니다. break는 for문이 i<10까지 반복되어야 함에도 i가 6일때 반복문에서 빠져나와 아래의 goto 문으로 직행합니다.

 

세번째점프

goto는 뒤에 정의된 라벨이름으로 바로 직행합니다. 즉 아래의 near the end를 출력하라는 명령어는 실행되지 않습니다. 대신 end라벨 뒤의 프린트문을 실행한 후 함수가 원래 출력된 위치로 리턴됩니다. 리턴값은 없는 함수네요.

 

결과는 위와 같이 출력될것입니다.

 

 

 

 

한거지 더 기억해두면 좋은것은 goto문의 label 위치는 꼭 goto문의 뒤에 올 필요는 없다는 것입니다.

 

label의 위치

즉 label 위치는 앞에 오거나 뒤에 오거나 관계 없군요.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void foo(void);

main()
{
    foo();
}

void foo(void){
        for (int i =0; i<10; i++){
            printf("%d", i);
            if (i ==2){
                i =3;
                continue;
            }else if(i ==6){
                break;
            }
        }
        end:
        printf("the end\n");
        return;
        goto end;
        printf("near the end\n");
        return;
        printf("or is it?");
    }

 

테스트를 해봤습니다. end라벨을 goto 문 위치 위로 해서 실행 해 보았더니, 잘 실행되는군요; 단, goto와 end는 같은 함수내에 위치해야 합니다. 이게 가능해도 가능하면 찾기 좋게 순서대로 배열하는 것이 좋을거 같다는 생각이 드는군요.

 

실행결과

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading