名前空間
変種
操作

From cppreference.com
< c‎ | language

文 (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)
1) goto のターゲット。
2) switch 文の case ラベル。
3) switch 文の default ラベル。

任意の文 (ただし宣言は除く) の前には、任意の数の「ラベル」 (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) と呼ばれます。これは、forwhile ループに空の本体を提供するためによく使われます。また、複合文の末尾や宣言の前にラベルを付けるためにも使用できます。

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)
1) if
2) else 節を持つ if
3) switch

[編集] 繰り返し文

繰り返し文は、文を繰り返し実行します。

attr-spec-seq(任意)(C23以降) while ( ) (1)
attr-spec-seq(任意)(C23以降) do while ( ) ; (2)
attr-spec-seq(任意)(C23以降) for ( 初期化節 ; (任意) ; (任意) ) (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 (任意) ; (3)
attr-spec-seq(任意)(C23以降) goto 識別子 ; (4)
1) break
2) continue
3) 任意の式を持つ return
4) goto

[編集] 参照

  • 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

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)