2 연산점프
dalmurii edited this page 2026-06-28 16:03:29 +00:00

goto라는 문법이 있습니다.
대강 라벨을 미리 만들어 놨다가 라벨로 점프하는 기능입니다.

int main(void);
int main(void) {
        int idx = 5;
        while(idx --> 0);
        return 0;
}

위는 아주 간단한 while을 활용한 반복문입니다.
아래는 라벨과 점프를 이용해 반복문을 구현합니다.

int main(void);
int main(void) {
        int idx = 5;
LABEL_INIT:
        if(idx --> 0)
                goto LABEL_INIT;
        goto LABEL_FINI;
LABEL_FINI:

        return 0;
}

그러나 라벨을 넣는 방법이 실제 라벨의 이름을 리터럴로 넣는 방법밖에 없습니다.
연산된 점프는 점프할 라벨의 위치를 저장하고, 불러내어 그 위치로 점프할 수 있습니다.
라벨을 변수 등에 저장할 수 있다는 것이 큰 차이입니다.
아래는 위 반복문을 연산된 점프로 구현합니다.

int main(void);
int main(void) {
        int idx = 5;
        void*   labels[] = {
                &&LABEL_FINI, 
                &&LABEL_INIT
        };

LABEL_INIT:
        goto *labels[idx --> 0];
LABEL_FINI:

        return 0;
}