programing

C에서 당신은 왜 goto label 후에 statement가 필요합니까?

linuxpc 2023. 9. 13. 22:22
반응형

C에서 당신은 왜 goto label 후에 statement가 필요합니까?

저는 C 코드를 쓰고 있는데 제 코드에는 두 개의 중첩 루프가 있습니다.특별한 조건으로 나는break내부 고리를 벗어나서continue외륜나는 이를 위해 외부 루프의 코드 끝에 있는 라벨을 사용하려고 노력했고, 조건에 따라,goto그 상표.하지만gcc복합 문 끝에 레이블을 가질 수 없다는 오류를 제공합니다.왜 안 되나요?

참고 1: 이것은 A가 아닙니다.switch성명서와 그 질문은 다른 곳에서 답변을 받았습니다.

참고 2: 이것은 스타일과 사용해야 하는지 말아야 하는지에 대한 질문이 아닙니다.goto대신 문 또는 조건 변수를 선택합니다.

편집: 사람들이 예시를 요청했는데, 저는 다른 어레이의 하위 어레이인지 확인하는 약간의 쉬운 예시를 제시할 수 있습니다.

    int superArray[SUPER_SIZE] = {...}, subArray[SUB_SIZE] = {...};
    int superIndex, subIndex;

    for (superIndex=0; superIndex<SUPER_SIZE-SUB_SIZE; superIndex+=1)
    {
      for (subIndex=0; subIndex<SUB_SIZE; subIndex+=1)
        if (superArray[superIndex+subIndex] != subArray[subIndex])
          goto break_then_continue;

      // code that executes if subArray is a sub array

      break_then_continue:
    }

표준에서 라벨은 문장에 속한다고 명시적으로 말하고 있으므로 단순한 세미콜론 (;라벨을 부착하면 문제를 회피할 수 있습니다. 이는 문장으로 간주되기 때문입니다.

심지어 6.8.3/6에서 ""1 문을 사용한 예도 있습니다.

3 복합문의 클로징 } 직전에 라벨을 부착하기 위해 null 문을 사용할 수도 있습니다.

while (loop1) {
  /* ... */

  while (loop2) {
    /* ... */

    if (want_out)
      goto end_loop1;

    /* ... */
  }

  /* ... */

  end_loop1: ;
}

1 표준에서는 이를 a라고 합니다.null statement.


6.8.1 표식문

Syntax
  1 labeled-statement:
      identifier : statement
      case constant-expression : statement
      default : statement

주의하세요.statement위의 인용문에서는 선택사항이 아닙니다.


다음과 같은 내용만 적으면 됩니다.

label: ;

세미콜론은 빈 문입니다.언어가 그렇게 정의되어 있기 때문에 필요합니다. 빈 문장이라도 문장으로 가야 합니다.

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; i < M; j++)
        {
            ...
            if (some_condition)
                goto continue_loop1;
            ...
        }
continue_loop1: ;
    }

레이블의 들여쓰기에 대해 논쟁할 수 있습니다.

레이블이 문장을 가리켜야 합니다.

C는 다음과 같이 규정합니다.

(C99, 6.8.1 Labeled 문 p4) "모든 문 앞에는 식별자를 라벨 이름으로 선언하는 접두사가 선행될 수 있습니다."

사용자의 경우 null 문을 사용할 수 있습니다.

void foo(void)
{
    goto bla;

    bla:
    ;
 }

null 문은 작업을 수행하지 않습니다.

또는 선언이 있는 경우 복합 문(블록)을 사용할 수도 있습니다.

void foo(void)
{
    goto bla;

    bla:
    {
        int x = 42;
        printf("%d\n", x);
    }
 }

언급URL : https://stackoverflow.com/questions/9730893/in-c-why-do-you-need-a-statement-after-a-goto-label

반응형