반응형

goto문.

구글검색을 해보면 goto문은 스파게티 코드가 될 수 있으니 되도록 쓰지 말라. 라는 이야기가 쏟아져 나온다.

그럼에도 불구하고 유용하게 쓸 데가 있는 goto문.

내 경우는 에러처리 하는 함수에서 또는 중첩 반복문 같은데서 쓰면 신나게 된달까.

지원하지 않는 함수도 아니고 불법도 아닌데! 필요하면 쓰도록 하자!


goto를 보면서 늘 궁금했던 것.


1. 라벨(LABEL)은 대체 어디가 문장의 끝이라 판단하는 것인가?

이미 goto문을 아는 사람이라면 이게 말도 안되는 질문이라 생각하겠지만, 난 "LABEL:"을 정의하는게 for, if, while 처럼 일정한 범위( 중괄호 안의 내용 )까지 실행하고 끝난다고 생각했다.

하다못해 쉘스크립트에 if - fi 같은게 왜 없는지 의문이었다.

그러다보니 특정 프로그램에서는 goto문이 인식이 되지 않는구나 라는 말도 안되는 결론을 지어버리고 그냥 안썼다. 

하지만 끝까지 모른 척 하고 갈 수는 없는 노릇.

printf로 열심히 찍어가며 삽질 하다 보니 어느 순간 쏵 이해가 됨!


어쨌든 다시 질문으로 돌아가서, 예를들어


goto A;


A:

printf("aaa");

B:

printf("bbb");

C:

printf("ccc");


return 0;


라고 정의하면 aaa만 출력되고 return 0이 될 것이라고 생각했다. 컴퓨터에게 넘나 인간적인 생각을 바란 듯


하지만 결과는 aaa bbb ccc 모두 출력이 되고 return 0이 됐다. 


결론을 말하자면, LABEL: 은 그냥 말 그대로 북마크 수준의 표지판 같은 의미고 이 북마크가 적혀있든 아니든 코드는 순차적으로 실행된다.

그러니까 처음과 끝을 표시할 방법도, 필요도 없는 것이다.


만약 bbb, ccc를 출력하고 싶지 않다면 aaa바로 아래에 return 0을 써주는 방법이 있겠다.

반응형

'즐개씨의 개발일지' 카테고리의 다른 글

Makefile 만들기  (0) 2017.08.04
RabbitVCS 설치 명령어  (0) 2017.08.02
연산자 우선순위에 관한 웃지 못할 해프닝들  (0) 2017.06.15
[Embedded] 용어  (0) 2016.02.26
[Linux]  (0) 2016.02.19

+ Recent posts