수색…


통사론

  • 반환 가치; / * 현재 함수에서 리턴합니다. val은 함수의 반환 형식으로 변환되는 모든 형식의 값일 수 있습니다. * /
  • 반환; / * 현재 void 함수에서 리턴합니다. * /
  • 단절; / * 무조건 (Iteration Statement) (루프)의 끝을 뛰어 넘거나 가장 안쪽의 switch 문에서 벗어난다. * /
  • 잇다; / * Iteration Statement (루프)의 시작 부분으로 무조건적으로 이동합니다. * /
  • LBL로 가라. / * 레이블 LBL로 이동합니다. * /
  • LBL : / * 동일한 함수의 모든 문. * /

비고

키워드로 C에 통합 된 점프입니다.

C에는 데이터 유형, jmp_buf 및 C 라이브러리 호출 인 setjmplongjmp 로 지정되는 또 다른 점프 구조 인 long jump 가 있습니다.

또한보십시오

반복문 / 루프 : for, while, do-while

goto를 사용하여 중첩 된 루프에서 빠져 나옵니다.

중첩 된 루프에서 점프하는 것은 일반적으로 루프에서이 변수를 검사하는 부울 변수를 사용해야합니다. 우리가 ij 반복 할 때, 다음과 같이 보일 수 있습니다.

size_t i,j;
for (i = 0; i < myValue && !breakout_condition; ++i) {
    for (j = 0; j < mySecondValue && !breakout_condition; ++j) {
        ... /* Do something, maybe modifying breakout_condition */
            /* When breakout_condition == true the loops end */
     }
}   

그러나 C 언어는이 경우에 유용 할 수있는 goto 절을 제공합니다. 루프 뒤에 선언 된 레이블을 사용하면 루프에서 쉽게 벗어날 수 있습니다.

size_t i,j;
for (i = 0; i < myValue; ++i) {
    for (j = 0; j < mySecondValue; ++j) {
        ...
        if(breakout_condition) 
          goto final;
    }
}
final:

그러나 종종이 필요성이 오면 대신 return 대신 사용할 수 있습니다. 이 구조는 또한 구조 프로그래밍 이론에서 "구조화되지 않은"것으로 간주됩니다.

goto 가 유용 할 수있는 또 다른 상황은 오류 처리기로 점프하는 것입니다.

ptr = malloc(N *  x);
if(!ptr)
  goto out_of_memory;

/* normal processing */
free(ptr);
return SUCCESS;

out_of_memory:
 free(ptr); /* harmless, and necessary if we have further errors */
 return FAILURE;

goto 를 사용하면 일반적인 프로그램 제어 흐름과 별도로 오류 흐름이 유지됩니다. 그러나 기술적 인 의미에서 "구조화되지 않은"것으로 간주됩니다.

반환 값 사용

값을 반환하는 중

일반적으로 사용되는 경우 : main()

#include <stdlib.h> /* for EXIT_xxx macros */

int main(int argc, char ** argv)
{
  if (2 < argc)
  {
    return EXIT_FAILURE; /* The code expects one argument: 
                            leave immediately skipping the rest of the function's code */
  }

  /* Do stuff. */

  return EXIT_SUCCESS;
}

추가 참고 사항 :

  1. 반환 유형이 void ( void * 또는 관련 유형 제외) 인 함수의 경우 return 문에 연결된 표현식이 없어야합니다. 즉, 유일하게 허용되는 return 문은 return; .

  2. void 가 아닌 반환 유형이있는 함수의 경우 return 문은 표현식없이 나타나서는 안됩니다.

  3. 대한 main() (그리고에만 main() ), 명시 적으로 return 문 (C99 또는 이상) 필요하지 않습니다. 실행이 종료에 도달하면 } , 0 의 내재적 값이 리턴됩니다. 어떤 사람들은이 return 생략하는 것이 나쁜 습관이라고 생각합니다. 다른 사람들은 적극적으로 그것을 떠날 것을 제안합니다.

아무것도 반환하지 않음

void 함수로부터의 복귀

void log(const char * message_to_log)
{
  if (NULL == message_to_log)
  {
    return; /* Nothing to log, go home NOW, skip the logging. */
  }

  fprintf(stderr, "%s:%d %s\n", __FILE__, _LINE__, message_to_log);

  return; /* Optional, as this function does not return a value. */
}

중단 및 계속 사용

즉시 잘못된 입력을 continue 읽거나 사용자 요청 또는 파일 끝에서 break 하십시오.

#include <stdlib.h> /* for EXIT_xxx macros */
#include <stdio.h>  /* for printf() and getchar() */
#include <ctype.h> /* for isdigit() */

void flush_input_stream(FILE * fp);


int main(void)
{
  int sum = 0;
  printf("Enter digits to be summed up or 0 to exit:\n");

  do
  {
    int c = getchar();
    if (EOF == c)
    {
      printf("Read 'end-of-file', exiting!\n");

      break;
    }

    if ('\n' != c)
    {
      flush_input_stream(stdin);
    }

    if (!isdigit(c))
    {
      printf("%c is not a digit! Start over!\n", c);

      continue;
    }

    if ('0' == c)
    {
      printf("Exit requested.\n");

      break;
    }

    sum += c - '0';

    printf("The current sum is %d.\n", sum);
  } while (1);

  return EXIT_SUCCESS;
}

void flush_input_stream(FILE * fp)
{
  size_t i = 0;
  int c;
  while ((c = fgetc(fp)) != '\n' && c != EOF) /* Pull all until and including the next new-line. */
  {
    ++i;
  }

  if (0 != i)
  {
    fprintf(stderr, "Flushed %zu characters from input.\n", i);
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow