文
文 (statement) は、C プログラムの断片であり、順次実行されます。任意の関数の本体は複合文であり、それは文と宣言の並びです。
int main(void) { // start of a compound statement int n = 1; // declaration (not a statement) n = n+1; // expression statement printf("n = %d\n", n); // expression statement return 0; // return statement } // end of compound statement, end of function body
文には5つの種類があります。
|
属性指定子シーケンス (attr-spec-seq) は、ラベルなしの文に適用できます。その場合 (式文を除く)、属性はそれぞれの文に適用されます。 |
(C23以降) |
目次 |
[編集] ラベル
任意の文は、文自体の前に名前とそれに続くコロンを置くことで、「ラベル付け」 (labeled) することができます。
attr-spec-seq(任意)(C23以降) 識別子 : |
(1) | ||||||||
attr-spec-seq(任意)(C23以降) case 定数式 : |
(2) | ||||||||
attr-spec-seq(任意)(C23以降) default : |
(3) | ||||||||
任意の文 (ただし宣言は除く) の前には、任意の数の「ラベル」 (labels) を置くことができます。各ラベルは、識別子をラベル名として宣言し、その名前は囲んでいる関数内で一意でなければなりません (言い換えれば、ラベル名は関数スコープを持ちます)。
ラベル宣言は、それ自体では効果を持たず、制御フローを変更したり、続く文の動作をいかなる形でも変更したりしません。
|
ラベルの後には文が続かなければなりません。 |
(C23まで) |
|
ラベルは、それに続く文なしで現れることがあります。ラベルがブロック内に単独で現れた場合、それはヌル文が続いているかのように振る舞います。 任意のattr-spec-seqはラベルに適用されます。 |
(C23以降) |
[編集] 複合文
複合文 (compound statement) 、または「ブロック」 (block) は、波括弧で囲まれた文と宣言の並びです。
{ 文 | 宣言...(任意) } |
(C23まで) | ||||||||
attr-spec-seq(任意) { ラベルなしの文 | ラベル | 宣言...(任意) } |
(C23以降) | ||||||||
複合文は、一連の宣言と文を1つの単位にまとめることを可能にし、単一の文が期待される場所 (例えば if 文や繰り返し文の中) で使用できます。
if (expr) // start of if-statement { // start of block int n = 1; // declaration printf("%d\n", n); // expression statement } // end of block, end of if-statement
各複合文は、独自のブロックスコープを導入します。
ブロック内で宣言された自動記憶域期間を持つ変数の初期化子と、VLA の宣言子は、制御フローがこれらの宣言を通過する際に、それらが文であるかのように順に実行されます。
int main(void) { // start of block { // start of block puts("hello"); // expression statement int n = printf("abc\n"); // declaration, prints "abc", stores 4 in n int a[n*printf("1\n")]; // declaration, prints "1", allocates 8*sizeof(int) printf("%zu\n", sizeof(a)); // expression statement } // end of block, scope of n and a ends int n = 7; // n can be reused }
[編集] 式文
式の後にセミコロンを付けたものは文です。
式(任意) ; |
(1) | ||||||||
attr-spec-seq 式 ; |
(2) | (C23以降) | |||||||
典型的なCプログラムにおけるほとんどの文は、代入や関数呼び出しなどの式文です。
式のない式文は「ヌル文」 (null statement) と呼ばれます。これは、for や while ループに空の本体を提供するためによく使われます。また、複合文の末尾や宣言の前にラベルを付けるためにも使用できます。
puts("hello"); // expression statement char *s; while (*s++ != '\0') ; // null statement
|
任意のattr-spec-seqは式に適用されます。 attr-spec-seqに |
(C23以降) |
[編集] 選択文
選択文は、式の値に応じて複数の文の中から1つを選択します。
attr-spec-seq(任意)(C23以降) if ( 式 ) 文 |
(1) | ||||||||
attr-spec-seq(任意)(C23以降) if ( 式 ) 文 else 文 |
(2) | ||||||||
attr-spec-seq(任意)(C23以降) switch ( 式 ) 文 |
(3) | ||||||||
[編集] 繰り返し文
繰り返し文は、文を繰り返し実行します。
attr-spec-seq(任意)(C23以降) while ( 式 ) 文 |
(1) | ||||||||
attr-spec-seq(任意)(C23以降) do 文 while ( 式 ) ; |
(2) | ||||||||
attr-spec-seq(任意)(C23以降) for ( 初期化節 ; 式(任意) ; 式(任意) ) 文 |
(3) | ||||||||
[編集] ジャンプ文
ジャンプ文は、無条件に制御フローを移します。
attr-spec-seq(任意)(C23以降) break ; |
(1) | ||||||||
attr-spec-seq(任意)(C23以降) continue ; |
(2) | ||||||||
attr-spec-seq(任意)(C23以降) return 式(任意) ; |
(3) | ||||||||
attr-spec-seq(任意)(C23以降) goto 識別子 ; |
(4) | ||||||||
[編集] 参照
- C23標準 (ISO/IEC 9899:2024)
- 6.8 Statements and blocks (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 6.8 Statements and blocks (p: 106-112)
- C11標準 (ISO/IEC 9899:2011)
- 6.8 Statements and blocks (p: 146-154)
- C99標準 (ISO/IEC 9899:1999)
- 6.8 Statements and blocks (p: 131-139)
- C89/C90標準 (ISO/IEC 9899:1990)
- 3.6 STATEMENTS
[編集] 関連項目
| C++ ドキュメント の 文
|