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;
}