Namespaces
Variants

Statements

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

は、C++プログラムの断片であり、順番に実行されます。任意の関数の本体は文のシーケンスです。例えば:

int main()
{
    int n = 1;                        // 宣言文
    n = n + 1;                        // 式文
    std::cout << "n = " << n << '\n'; // 式文
    return 0;                         // return文
}

C++には以下の種類の文が含まれます:

(C++26以降)
(TM TS)
HTMLタグ、属性、および`(TM TS)`というテキストは翻訳せず、元のフォーマットを保持しました。「Atomic and synchronized blocks」を「アトミックおよび同期ブロック」と正確に翻訳しました。

目次

ラベル付きステートメント

ラベル付きステートメントは、制御フローの目的でステートメントにラベルを付けます。

ラベル文
label - 文に適用されるラベル(後述の定義を参照)
statement - ラベルが適用される文。ラベル付き文自体も可能であり、複数のラベルを付与できる

ラベル

label は次のように定義されます

attr  (オプション) identifier : (1)
attr  (オプション) case constexpr : (2)
attr  (オプション) default: (3)
1) goto のターゲット;
2) case ラベル( switch 文内);
3) default switch 文内のラベル。

属性 シーケンス attr は、ラベルの先頭(その場合、ラベルに適用される)、または任意の文自体の直前(その場合、文全体に適用される)に現れることがあります。

(C++11以降)

関数内で宣言された識別子を持つラベルは、その関数内のすべての入れ子ブロックにおいて、自身の宣言前後を問わず、同じ識別子を持つすべてのgoto文と一致します。

関数内の2つのラベルが同じ識別子を持つことは許可されません。

文に追加されるだけでなく、ラベルは 複合文 内の任意の場所でも使用できます。

(C++23以降)

ラベルは unqualified lookup では見つかりません:ラベルはプログラム内の他の任意のエンティティと同じ名前を持つことができます。

void f()
{
    {
        goto label; // 宣言が後であってもラベルはスコープ内
        label:      // C++23以降、ラベルはブロックの末尾に単独で記述可能
    }
    goto label; // ラベルはブロックスコープを無視
}
void g()
{
    goto label; // エラー: g()内でラベルがスコープにない
}

制御フロー限定ステートメント

以下のステートメントは 制御フロー制限ステートメント です:

(C++17以降)
(C++23以降)

各制御フロー制限文 S について:

  • S 内で宣言されたすべての goto ターゲットラベルは、 S 内のステートメントによってのみ参照できます。
  • S 内に現れる各 case または default ラベルは、 S 内の switch とのみ関連付けられます。

式文

式文はセミコロンが続く式です。

attr  (オプション) expression  (オプション) ;
attr - (since C++11) 任意の数の 属性 のオプションのシーケンス
expression -

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

式を持たない式文は null statement と呼ばれます。これは for ループや while ループに空のボディを提供するためによく使用されます。 また、複合文の末尾でラベルを付けるためにも使用できます。 (C++23まで)

複合文

複合ステートメントまたは block は、一連のステートメントを単一のステートメントにグループ化します。

attr  (オプション) { statement...  (オプション) label...  (オプション) (C++23以降) }

単一の文が期待される場所で、複数の文を順次実行する必要がある場合(例えば、 if 文やループ内など)、複合文を使用できます:

if (x > 5)          // if文の開始
{                   // ブロックの開始
    int n = 1;      // 宣言文
    std::cout << n; // 式文
}                   // ブロックの終了、if文の終了

各複合ステートメントは独自のブロック scope を導入します。ブロック内で宣言された変数は、閉じ括弧で逆順に破棄されます:

int main()
{ // 外側ブロックの開始
    {                                // 内側ブロックの開始
        std::ofstream f("test.txt"); // 宣言文
        f << "abc\n";                // 式文
    }                                // 内側ブロックの終了、fはフラッシュされ閉じられる
    std::ifstream f("test.txt"); // 宣言文
    std::string str;             // 宣言文
    f >> str;                    // 式文
} // 外側ブロックの終了、strは破棄され、fは閉じられる

複合文の末尾にある ラベル は、null文が後に続くかのように扱われます。

(C++23以降)

選択ステートメント

選択ステートメントは、複数の制御フローのうち1つを選択します。

attr  (オプション) if constexpr (オプション) ( init-statement  (オプション) condition ) statement (1)
attr  (オプション) if constexpr (オプション) ( init-statement  (オプション) condition ) statement
else statement
(2)
attr  (オプション) switch ( init-statement  (オプション) condition ) statement (3)
attr  (オプション) if ! (オプション) consteval compound-statement (4) (C++23以降)
attr  (オプション) if ! (オプション) consteval compound-statement else statement (5) (C++23以降)
1) if 文;
2) if else句を持つ文;
3) switch 文;
5) consteval if 文とelse節。

反復文

反復文は、一部のコードを繰り返し実行します。

attr  (オプション) while ( condition ) statement (1)
attr  (オプション) do statement while ( expression ) ; (2)
attr  (オプション) for ( init-statement condition  (オプション) ; expression  (オプション) ) statement (3)
attr  (オプション) for
( init-statement  (オプション) (C++20以降) for-range-decl : for-range-init ) statement
(4) (C++11以降)
1) while ループ;
2) do-while ループ;
3) for ループ;
4) range for ループ。

ジャンプ文

jump文は無条件に制御フローを転送します。

attr  (オプション) break; (1)
attr  (オプション) continue; (2)
attr  (オプション) return expression  (オプション) ; (3)
attr  (オプション) return braced-init-list ; (4) (C++11以降)
attr  (オプション) goto identifier ; (5)
1) break 文;
2) continue 文;
3) return 文とオプションの式;
4) return statement using list initialization ;
5) goto 文。

注: すべてのジャンプ文において、ループ外、ブロック外、または自動記憶域期間を持つ初期化済み変数を越えた後方へのジャンプは、ジャンプ元のスコープにあるがジャンプ先のスコープにはない自動記憶域期間を持つオブジェクトの破棄を伴います。複数のオブジェクトが初期化されている場合、破棄の順序は初期化の順序と逆になります。

アサーション文

契約アサーション

contract_assert attr  (optional) ( predicate ) ;
(C++26以降)

宣言文

宣言文は1つ以上の識別子をブロックに導入します。

block-declaration (1)
1) 詳細については Declarations および Initialization を参照してください。

try ブロック

A try ブロックは、他のステートメントの実行中にスローされた例外をキャッチします。

attr  (optional) try compound-statement handler-sequence (1)
1) 詳細については try block を参照してください。


Atomicおよびsynchronizedブロック

atomicおよびsynchronizedブロックは トランザクショナルメモリ を提供します。

synchronized compound-statement (1) (TM TS)
atomic_noexcept compound-statement (2) (TM TS)
atomic_cancel compound-statement (3) (TM TS)
atomic_commit compound-statement (4) (TM TS)
1) synchronizedブロック 、全てのsynchronizedブロックとの単一の全順序で実行される;
2) atomicブロック 、例外発生時に中止する;
3) atomicブロック 、例外発生時にロールバックする;
4) atomicブロック 、例外発生時にコミットする。
(TM TS)

サブステートメント

substatement は、以下のいずれかを指します:

  • ラベル付き文 に対しては、その statement 。
  • 複合文 に対しては、その statement... の任意の文。
  • 選択文 に対しては、その statement  または compound-statement  (C++23以降) のいずれか。
  • 反復文 に対しては、その statement 。

S1 は、以下の条件のいずれかを満たす場合に文 S2 囲む とされます:

  • S2 S1 の副文である
  • S1 が選択文または反復文であり、 S2 init-statement である場合
  • S1 try ブロック であり、 S2 がその compound-statement または handler-seq 内の任意の ハンドラ compound-statement である場合
  • S1 が文 S3 を包含し、 S3 S2 を包含する場合

S1 は、文 S2 によって 囲まれている とされます。これは S2 S1 を囲んでいる場合です。

関連項目

C ドキュメント for Statements