C

C언어를 가르칩니다.

C C언어를 가르칩니다.

goto

goto문을 알아봅니다.

goto

정의

goto, 어디로 간다는 뜻입니다. 특정 레이블(label)로 이동합니다. 기본 형태는 다음과 같습니다.

goto /*label name*/;

레이블은 이렇게 설정합니다.

/*label name*/:

 

용법

사실 if else와 goto만으로 모든 코드를 다 짤 수 있습니다. for과 while도 모두 goto로 구현할 수 있습니다.

#include <stdio.h>

int main(void)
{
  a:
  puts("goto 무한루프");
  goto a;
}
//goto 구구단
#include <stdio.h>

int main(void)
{
  int i=1;
  a:
  if (i==9) goto out;
  i++;
  int j=1;
  b:
  if (j>9) goto a;
  printf("%d x %d = %d\n",i,j,i*j);
  j++;
  goto b;
  out:
  return 0;
}

코드가 복잡해지죠? 게다가, 이건 작은 프로그램이라서 체감하기 어렵지만 goto를 남용하면 프로그램이 느려지고 컴파일러가 최적화를 하기도 힘들어집니다. 웬만하면 쓰지 맙시다.

쓰지 말자고 했지만, 쓰지 않을 수 없는 goto가 있습니다. 바로 break와 continue입니다. 둘 다 이름만 다른 goto문입니다. 그렇다고 break와 continue까지 기피할 필요는 없습니다.

위험성?

goto를 남용하는 것이 아주 안 좋은 습관인 것은 맞는데, 가끔은 쓸모가 있습니다. 가령 다중 루프를 한꺼번에 탈출해야 할 때가 그렇습니다. goto를 쓰지 않고 다중 루프를 탈출하게 하는 다음 코드를 봅시다.

bool a=true;
while (a)
{
    for (int i=0; i<10 && a; i++)
        for (int j=0; j<10 && a; j++)
            for (int k=0; k<10; k++)
            {
                /* some code */
                int input;
                scanf("%d",&input);
                if (input==7)
                {
                    a=false;
                    break;
                }
            }
}

루프를 한꺼번에 탈출해야 하는지 여부를 정하는 변수 a를 설정해야 합니다. 이런 a같은 변수를 플래그(flag)라 합니다. 꽤나 불편하지 않습니까? 매 조건식마다 && a도 추가해줘야 합니다. 이럴 때 빛을 발하는 것이 goto 문입니다.

while (true)
{
    for (int i=0; i<10; i++)
        for (int j=0; j<10; j++)
            for (int k=0; k<10; k++)
             {
                /*some code*/
                int input;
                scanf("%d",&input);
                if (input==7)
                    goto out;
             }
}
out:
/*some code*/

얼마나 간단합니까! 다중 루프를 탈출할 때는 goto를 쓰는 게 좋습니다(일반적으로는요).

그밖에도, C++에서 자원을 모두 해제해주는 코드에 goto 레이블을 쓰기도 합니다.

댓글

댓글 본문
작성자
비밀번호
버전 관리
truelight
현재 버전
선택 버전
graphittie 자세히 보기