Namespaces
Variants

Statements

From cppreference.net

Cプログラムの文(statements)は、順次実行されるプログラムの断片です。任意の関数の本体は複合文(compound statement)であり、これは文と宣言のシーケンスです:

int main(void)
{ // 複合文の開始
    int n = 1; // 宣言(文ではない)
    n = n+1; // 式文
    printf("n = %d\n", n); // 式文
    return 0; // return文
} // 複合文の終了、関数本体の終了


ステートメントには5つの種類があります:

属性指定子シーケンス ( attr-spec-seq ) はラベルなし文に適用でき、その場合(式文を除く)属性はそれぞれの文に適用されます。

(C23以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++の専門用語(Labels、Compound statements、Expression statements、Selection statements、Iteration statements、Jump statements)は原文のまま保持しました - 一般的な用語(References、See also)も原文のまま保持しました - HTMLタグ、属性、class名、IDなどはすべて変更せず保持しました - 番号部分もそのまま保持しました

ラベル

任意のステートメントは、 ラベル付け することができます。ステートメントの前に名前とコロンを付けることで実現します。

attr-spec-seq (オプション) (C23以降) identifier : (1)
attr-spec-seq (オプション) (C23以降) case constant-expression : (2)
attr-spec-seq (オプション) (C23以降) default : (3)
1) goto のターゲット。
2) switch 文内のケースラベル。
3) switch 文におけるデフォルトラベル。

任意の文(ただし宣言を除く)の前に任意の数の ラベル を置くことができます。各ラベルは identifier をラベル名として宣言し、これは外側の関数内で一意でなければなりません(言い換えると、ラベル名は function scope を持ちます)。

ラベルの宣言は単独では効果がなく、制御フローを変更せず、後続の文の動作をいかなる方法でも変更しません。

ラベルは文が後に続かなければならない。

(C23まで)

ラベルはそれに続く文なしで現れることができる。ラベルがブロック内で単独で現れる場合、 null文 が後に続くかのように振る舞う。

オプションの attr-spec-seq はラベルに適用される。

(C23以降)

複合文

複合ステートメント、または block は、中括弧で囲まれた一連のステートメントと宣言です。

{ ステートメント | 宣言 ... (オプション) } (C23まで)
属性指定子シーケンス (オプション) { ラベルなしステートメント | ラベル | 宣言 ... (オプション) } (C23以降)

複合文は、宣言と文の集合を1つの単位としてグループ化することを可能にし、単一文が期待される場所であればどこでも使用できます(例えば、 if 文や反復文内で):

if (expr) // if文の開始
{ // ブロックの開始
  int n = 1; // 宣言
  printf("%d\n", n); // 式文
} // ブロックの終了、if文の終了

各複合文は独自の ブロックスコープ を導入します。

自動 記憶域期間 を持つ変数の初期化子と、ブロック内で宣言された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は再利用可能
}

式文

式の後にセミコロンを付けると、それは文となります。

(オプション) ; (1)
属性指定子並び ; (2) (C23以降)

典型的なCプログラムのほとんどの文は、代入や関数呼び出しなどの式文です。

式を持たない式文は null statement と呼ばれます。これは for ループや while ループに空のボディを提供するためによく使用されます。また、複合文の終端や宣言の前にラベルを配置するためにも使用できます:

puts("hello"); // 式文
char *s;
while (*s++ != '\0')
    ; // 空文

オプションの attr-spec-seq は式に適用されます。

attr-spec-seq の後に ; が続くものは式文を形成しません。代わりに 属性宣言 を形成します。

(C23以降)

選択文

選択ステートメントは、式の値に応じて複数のステートメントの中から1つを選択します。

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++ documentation for Statements
C++ documentation Statements