안녕하세요. 궁금증연구소 입니다.
오늘 포스팅 주제는 "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 위치는 앞에 오거나 뒤에 오거나 관계 없군요.
#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는 같은 함수내에 위치해야 합니다. 이게 가능해도 가능하면 찾기 좋게 순서대로 배열하는 것이 좋을거 같다는 생각이 드는군요.
[파이썬] yield from 문법 (python 3.3 이후 적용) (0) | 2022.07.22 |
---|---|
iterable 객체와 iterator 구분 (0) | 2022.07.21 |
[파이썬]f-string, format함수에서의 튜플 unpacking 정리 (0) | 2022.04.03 |
sqlite3 기능을 알아보자. (0) | 2022.03.12 |
Could not find a version that satisfies the requirement django==2.2 (파이썬 에러) (0) | 2022.01.15 |