C에서 goto 문 사용

Jinku Hu 2023년10월12일
  1. goto문을 사용하여 C에서 루프 구현
  2. goto문을 사용하여 C의 중첩 루프에서 벗어나기
C에서 goto 문 사용

이 기사에서는 C에서goto문을 사용하는 방법에 대한 여러 방법을 보여줍니다.

goto문을 사용하여 C에서 루프 구현

goto키워드는 C 언어의 일부이며 무조건 점프를 수행하는 구조를 제공합니다. ifswitch문은 조건부 점프의 예입니다. goto구성은goto호출 및 레이블 이름의 두 부분으로 구성됩니다. 코드의 모든 문 앞에는 식별자 뒤에 콜론이 오는 레이블이 올 수 있습니다. goto호출은 코드 실행이 레이블 뒤의 첫 번째 명령문으로 점프하도록합니다. goto는 동일한 함수 내의 레이블로만 이동할 수 있으며 레이블은 정의 된 행에 관계없이 전체 함수에서 볼 수 있습니다.

다음 예에서는 각주기에서 변수score1000과 비교하는 간단한 루프를 보여줍니다. score가 같지 않으면 증가하고 비교 문으로 다시 이동합니다. if문이 참이면 다른goto호출이 호출되고 실행이EXIT레이블로 점프하여 프로그램이 정상적으로 종료됩니다. 다른 많은 코드와 마찬가지로이 예제 코드는goto문없이 다시 구현할 수 있으므로 비교적 읽기 쉽습니다. 일반적으로goto문에 대해 격렬한 논쟁이 있었으며 일부는 읽을 수있는 코드에 완전히 해롭다 고 생각하고 다른 일부는 여전히 실용적인 사용 사례를보고 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  int score = 1;

START:
  if (score > 1000) goto EXIT;

  score += 1;
  goto START;

EXIT:
  printf("score: %d\n", score);
  exit(EXIT_SUCCESS);
}

출력:

score: 1001

goto문을 사용하여 C의 중첩 루프에서 벗어나기

goto문은 루프 내부의 조건문이 충족되고 일부 코드도 건너 뛰어야하는 경우 제어 흐름을 변경하는 데 유용 할 수 있습니다. 다음 코드 샘플은 환경 변수 배열에 액세스하고 검색하는 유사한 시나리오를 보여줍니다. 외부if문은 포인터가 유효한지 확인한 다음 루프 실행을 계속합니다. 루프 자체에는 각 환경 변수의 특정 문자열을 확인하는 또 다른 조건이 있습니다. 문자열이 발견되면 더 이상 처리 리소스를 낭비하지 않고 루프를 벗어나 다음printf문을 건너 뛸 수 있습니다. 이것은goto호출이 내부 if 문 내부에 포함되어 프로그램이 외부if문 밖으로 점프하게하고 나머지 코드를 계속 실행하게하는 유용한 경우를 만듭니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  if (environ != NULL) {
    for (size_t i = 0; environ[i] != NULL; ++i) {
      if (strncmp(environ[i], "HOME", 4) == 0) {
        puts(environ[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:

  exit(EXIT_SUCCESS);
}

출력:

HOME=/home/username
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook