[C언어] goto 문 과 labeling
COM2008. 2. 23. 23:02 |어느책을 보더라도, GOTO 문은 프로그래밍의 금기처럼 묘사된다. 그런데, 옛날기억을 더듬어 보면 GW-BASIC 베우던 시절에 GOTO 문은 약방의 감초처럼 사용됐었다. 구조적이고 모듈화된 프로그래밍을 무너뜨린다는 무조건분기문 GOTO. 어떤 책들은 GOTO문에 대한 언급은 딱 한줄. 유해하다는 것으로 끝내고, 구문의 설명등은 아예 생략하는 경우도 있다.
물론, GOTO 문이 없어도 원하는 기능은 다른 명령어들을 이용해서 구현할수 있고, 또한 그것이 바람직한 것으로 받아들여진다. 하지만, 때때로 GOTO 문은 복잡한 프로그램을 간결하게 해주기도 하고, 각각의 모듈내에서 독립적으로 쓰여 전체 프로그램의 틀을 해치지 않는다면, 적절하게 사용하는것은 절대 독이 아니라고 생각한다.
GW-BASIC 에서는 코드의 각 라인마다 번호를 붙여서 어느 라인으로 가라는 형식으로 사용했었다.
예) GOTO 110 ( 참고 : Fortran 도 같은 형식을 갖는다. )
그런데 C 코딩에서는 일반적으로 라인마다 넘버링을 하지 않는다. 그럼 어떻게 GOTO 문을 사용하는가?
바로 필요한 문장만 레이블을 붙여서 사용하면 된다.
레이블을 붙인 문장의 구문형식은 다음과 같다.
labeled_statement ::= label : statement
label ::= identifier
즉, 문장앞에 콜론(:) 을 이용하여 label을 붙이며, 이때 레이블의 형식은 identifier 와 동일하다.
( 참고 : 0-002. Tokens of C )
GOTO 문은 제어를 레이블(label)된 문장으로 넘긴다. 형식은 다음과 같다.
goto label ;
레이블은 중복해서 붙여도 상관없다.
즉, label1 : label2 : label3 : statement ; 처럼 붙여도 된다.
이제 goto 문이 들어간 예제를 보자. 다음의 예제는 while , for 의 반복문과 if , switch 등의 조건분기문을 이용하여 goto 없이 만들수 있다는것을 염두에 두자.
#include<stdio.h>
void main(void)
{
int n;
input: printf("Input a non-negative integer : " );
scanf("%d",&n);
if(n<0)
goto error;
printf("\nThe square of %d = %d \n\n",n,n*n);
return;
error: printf("\nAre you nuts? Try again -_-;\n\n");
goto input;
}