Namespaces
Variants

Statements

From cppreference.net

문장(statements)은 C 프로그램에서 순차적으로 실행되는 조각들입니다. 모든 함수의 본체는 복합 문장(compound statement)이며, 이는 다시 문장과 선언들의 순차적 나열입니다:

int main(void)
{ // 복합 문장의 시작
    int n = 1; // 선언 (문장이 아님)
    n = n+1; // 표현식 문장
    printf("n = %d\n", n); // 표현식 문장
    return 0; // 반환 문장
} // 복합 문장의 끝, 함수 본문의 끝


다섯 가지 유형의 문(statement)이 있습니다:

속성 지정자 시퀀스 ( attr-spec-seq )는 레이블이 없는 문에 적용될 수 있으며, 이 경우 (표현식 문을 제외하고) 해당 속성들은 각각의 문에 적용됩니다.

(C23부터)

목차

레이블

모든 문장은 labeled 될 수 있으며, 문장 앞에 콜론을 붙인 이름을 제공함으로써 가능합니다.

attr-spec-seq (선택 사항) (C23부터) identifier : (1)
attr-spec-seq (선택 사항) (C23부터) case constant-expression : (2)
attr-spec-seq (선택 사항) (C23부터) default : (3)
1) goto 의 대상.
2) switch 문의 case 레이블.
3) switch 문의 기본 레이블.

모든 구문(그러나 선언은 제외)은 임의의 수의 labels 로 앞에 올 수 있으며, 각 레이블은 identifier 를 레이블 이름으로 선언합니다. 이 이름은 포함하는 함수 내에서 고유해야 합니다(즉, 레이블 이름은 function scope 를 가집니다).

레이블 선언은 그 자체로는 아무런 효과가 없으며, 제어 흐름을 변경하지 않거나 뒤따르는 문장의 동작을 어떤 식으로든 수정하지 않습니다.

레이블은 반드시 문(statement) 뒤에 와야 합니다.

(C23 이전)

레이블은 뒤에 오는 문 없이 단독으로 나타날 수 있습니다. 만약 레이블이 블록 내에서 단독으로 나타나면, 널 문(null statement) 이 뒤에 오는 것처럼 동작합니다.

선택적 attr-spec-seq 은 레이블에 적용됩니다.

(C23 이후)

복합문

복합문(compound statement), 또는 블록(block) 은 중괄호로 둘러싸인 일련의 문(statements)과 선언(declarations)의 집합입니다.

{ 문장 | 선언 ... (선택 사항) } (C23 이전)
속성-지정자-시퀀스 (선택 사항) { 레이블-없는-문장 | 레이블 | 선언 ... (선택 사항) } (C23 이후)

복합 문(compound statement)은 선언과 문(statement)들의 집합을 하나의 단위로 그룹화하여, 단일 문이 예상되는 어디에서나 사용할 수 있도록 합니다 (예를 들어, if 문이나 반복 문에서):

if (expr) // if문 시작
{ // 블록 시작
  int n = 1; // 선언
  printf("%d\n", n); // 표현식 문장
} // 블록 끝, if문 끝

각 복합문은 자체적인 블록 범위 를 도입합니다.

블록 내부에 선언된 자동 storage duration 을 가진 변수들의 초기화와 VLA 선언자들은 제어 흐름이 이러한 선언들을 순서대로 통과할 때 실행되며, 마치 문장처럼 처리됩니다:

int main(void)
{ // 블록 시작
  { // 블록 시작
       puts("hello"); // 표현식 문장
       int n = printf("abc\n"); // 선언, "abc" 출력, n에 4 저장
       int a[n*printf("1\n")]; // 선언, "1" 출력, 8*sizeof(int) 할당
       printf("%zu\n", sizeof(a)); // 표현식 문장
  } // 블록 끝, n과 a의 스코프 종료
  int n = 7; // n 재사용 가능
}

표현식 문

세미콜론으로 끝나는 표현식은 문(statement)입니다.

expression (선택 사항) ; (1)
attr-spec-seq expression ; (2) (C23부터)

일반적인 C 프로그램에서 대부분의 문장은 할당이나 함수 호출과 같은 표현식 문입니다.

표현식이 없는 표현식 문을 null statement (널 문)이라고 합니다. 이것은 주로 for 루프나 while 루프에 빈 본문을 제공하기 위해 사용됩니다. 또한 복합 문의 끝이나 선언문 앞에 레이블을 배치하기 위해 사용될 수도 있습니다:

puts("hello"); // 표현식 문장
char *s;
while (*s++ != '\0')
    ; // 널 문장

선택적 attr-spec-seq 은 표현식에 적용됩니다.

attr-spec-seq 뒤에 ; 가 오는 것은 표현식 문(expression statement)을 형성하지 않습니다. 대신 속성 선언(attribute declaration) 을 형성합니다.

(C23 이후)

선택문

선택문은 표현식의 값에 따라 여러 문 중 하나를 선택합니다.

attr-spec-seq (선택 사항) (C23부터) if ( expression ) statement (1)
attr-spec-seq (선택 사항) (C23부터) if ( expression ) statement else statement (2)
attr-spec-seq (선택 사항) (C23부터) switch ( expression ) statement (3)
1) if
2) if else 절을 포함하는 문
3) switch

반복문

반복문은 문을 반복적으로 실행합니다.

attr-spec-seq (선택 사항) (C23부터) while ( expression ) statement (1)
attr-spec-seq (선택 사항) (C23부터) do statement while ( expression ) ; (2)
attr-spec-seq (선택 사항) (C23부터) for ( init-clause ; expression (선택 사항) ; expression (선택 사항) ) statement (3)
1) while 루프
2) do-while 루프
3) for 루프

점프 문

점프 문은 무조건적으로 흐름 제어를 전달합니다.

attr-spec-seq (선택 사항) (C23부터) break ; (1)
attr-spec-seq (선택 사항) (C23부터) continue ; (2)
attr-spec-seq (선택 사항) (C23부터) return expression (선택 사항) ; (3)
attr-spec-seq (선택 사항) (C23부터) goto identifier ; (4)
1) break
2) continue
3) return 선택적 표현식을 포함한 문
4) goto

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.8 문과 블록 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.8 문과 블록 (p: 106-112)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.8 문과 블록 (p: 146-154)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.8 문과 블록 (p: 131-139)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.6 문장

참고 항목

C++ 문서 참조: Statements