>

아래는 C 표준의 스 니펫입니다 (의 섹션 6.8.5 n1256 TC3 C99).

iteration-statement:
while(expression)statement
dostatementwhile(expression);
for(expressionopt;expressionopt;expressionopt)statement
for(declarationexpressionopt;expressionopt)statement

내 관심사가 가장 중요한 것은 마지막 진술이다 : for ( declaration expression ; expression ) statement . 6.8.5.1 for 설명  루프, 그러나 for ( clause-1 ; expression-2 ; expression-3 ) statement 만 언급  구문.

이 구문에 따라 코드를 작성하려고 시도했지만 구문 오류가 모두 발생했습니다. 예 :

for (int i = 0, i; i++) { /* ... */ }
for (int i = 0; !(i++)) { /* ... */ }

error: expected ‘;’ before ‘)’ token 와 유사한 오류가 발생하는 경우  GCC (v4.9.2)를 사용하여 컴파일 할 때

표준을 올바르게 해석하고 있는지 잘 모르겠습니다. 이 구문을 유용한 방식으로 사용할 수 있습니까, 아니면 내가 간과 한 것이 있습니까?


  • 답변 # 1

    보이면 구문은

    for ( declaration expression1opt ; expression2opt ) statement
    
    

    일반적인 진술과 비교해 보자

    for (int i = 0; i < 10; i++) printf("%d \t", i);
    
    

    여기

    int i = 0;   declaration 를 나타냅니다  [ ; 포함 ]

    i < 10   expression1opt 를 나타냅니다  [선택 사항]

    ;   ; 의 구문 요구 사항에 따라  [구문에 설명 된대로]

    i++   expression2opt 입니다  [선택 사항]

    printf("%d \t", i);   statement 입니다

    이제 귀하의 경우

    for (int i = 0, i; i++) { /* ... */ }
    
    

    int i = 0, i;   declaration 를 나타냅니다

    i++   expression1opt 를 나타냅니다

    ;  누락.....

    여기서 마지막으로 오류가 발생합니다. 당신은 ; 가 필요합니다  구문 검사를 통과해야합니다.

  • 답변 # 2

    안타깝게도 쉽게 읽을 수 없습니다. 당신은 for 의 두 번째 경우를 잘못 읽고 있습니다  성명서. 첫 번째 세미콜론은 declaration 의 필수 부분입니다  따라서 당신의 눈에 숨겨져 있습니다. 부록 A를 살펴보면 이러한 구문 질문을 쉽게 확인할 수 있습니다.

    (6.7) declaration: 
        declaration-specifiers init-declarator-listopt ;
        static_assert-declaration
    
    

  • 이전 c# - JavaScriptSerializer ()를 사용하여 JSON 파일 역 직렬화
  • 다음 gdb 스크립팅 - 선택된 중단 점에서 명령 실행