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
'programing' 카테고리의 다른 글
여러 범주형 수준에 대해 다른 색 그림 표시 (0) | 2023.09.13 |
---|---|
c의 메모리에 대한 포인터와 액세스.조심하세요. (0) | 2023.09.13 |
호스트 ' xxx.xx.xxx .xxx'은(는) 이 MySQL 서버에 연결할 수 없습니다. (0) | 2023.09.13 |
오류 유형:스트림이 필요한 곳에 잘못된 개체를 제공했습니다.관측 가능, 약속, 배열 또는 반복 가능한 값을 제공할 수 있습니다. (0) | 2023.09.13 |
GDB - 별도창에 대상어플리케이션 출력 표시 (0) | 2023.09.13 |