Statements
문장(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) | ||||||||
모든 구문(그러나 선언은 제외)은 임의의 수의 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 선언자들은 제어 흐름이 이러한 선언들을 순서대로 통과할 때 실행되며, 마치 문장처럼 처리됩니다:
표현식 문
세미콜론으로 끝나는 표현식은 문(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
뒤에
|
(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) | ||||||||
반복문
반복문은 문을 반복적으로 실행합니다.
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) | ||||||||
점프 문
점프 문은 무조건적으로 흐름 제어를 전달합니다.
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) | ||||||||
참고문헌
- 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
|