名前空間
変種
操作

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

文 (Statements) は、C++プログラムの断片であり、順次実行されます。あらゆる関数の本体は文のシーケンスです。例:

int main()
{
    int n = 1;                        // declaration statement
    n = n + 1;                        // expression statement
    std::cout << "n = " << n << '\n'; // expression statement
    return 0;                         // return statement
}

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

(C++26以降)
(TM TS)

目次

[編集] ラベル付き文

ラベル付き文は、制御フローの目的で文にラベルを付けます。

label statement
label - 文に適用されるラベル(後述)
statement - ラベルが適用される文。それ自体がラベル付き文であることも可能で、複数のラベルを付けることができます。

[編集] ラベル

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

attr(optional) identifier : (1)
attr(optional) case constexpr : (2)
attr(optional) default: (3)
1) goto のターゲット
2) switch 文内の case ラベル
3) switch 文内の default ラベル

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

(C++11以降)

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

1つの関数内で2つのラベルが同じ識別子を持つことはできません。

ラベルは文に追加されるだけでなく、複文内のどこでも使用できます。

(C++23から)

ラベルは非修飾名ルックアップでは見つかりません。ラベルはプログラム内の他のエンティティと同じ名前を持つことができます。

void f()
{
    {
        goto label; // label in scope even though declared later
        label:      // label can appear at the end of a block standalone since C++23
    }
    goto label; // label ignores block scope
}
 
void g()
{
    goto label; // error: label not in scope in g()
}

[編集] 制御フローが制限される文

以下の文は制御フローが制限される文 (control-flow-limited statements) です。

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

各制御フローが制限される文 S について:

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

[編集] 式文

式文は、式の後ろにセミコロンが付いたものです。

attr(optional) expression(optional) ;
attr - (C++11以降) 0個以上の属性からなる、省略可能なシーケンス
-

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

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

[編集] 複文

複文、またはブロックは、一連の文を単一の文にグループ化します。

attr(optional) { statement...(optional) label...(optional)(C++23から) }

1つの文が期待される場所で、複数の文を順に実行する必要がある場合(例えば、if 文やループ内)、複文を使用できます。

if (x > 5)          // start of if statement
{                   // start of block
    int n = 1;      // declaration statement
    std::cout << n; // expression statement
}                   // end of block, end of if statement

各複文は独自のブロックスコープを導入します。ブロック内で宣言された変数は、閉じ波括弧で逆の順序で破棄されます。

int main()
{ // start of outer block
    {                                // start of inner block
        std::ofstream f("test.txt"); // declaration statement
        f << "abc\n";                // expression statement
    }                                // end of inner block, f is flushed and closed
    std::ifstream f("test.txt"); // declaration statement
    std::string str;             // declaration statement
    f >> str;                    // expression statement
} // end of outer block, str is destroyed, f is closed

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

(C++23から)

[編集] 選択文

選択文は、複数の制御フローの中から1つを選択します。

attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement (1)
attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement
    else statement
(2)
attr(optional) switch ( init-statement(optional) condition ) statement (3)
attr(optional) if !(optional) consteval compound-statement (4) (C++23から)
attr(optional) if !(optional) consteval compound-statement else statement (5) (C++23から)
1) if
2) else 節を持つ if
3) switch
5) else 節を持つ consteval if

[編集] 反復文

反復文は、あるコードを繰り返し実行します。

attr(optional) while ( condition ) statement (1)
attr(optional) do statement while ( expression ) ; (2)
attr(optional) for ( init-statement condition(optional) ; expression(optional) ) statement (3)
attr(optional) for
    ( init-statement(optional)(C++20から) for-range-decl : for-range-init ) statement
(4) (C++11以降)
1) while ループ
2) do-while ループ
3) for ループ
4) 範囲 for ループ

[編集] ジャンプ文

ジャンプ文は、無条件に制御フローを移します。

attr(optional) break; (1)
attr(optional) continue; (2)
attr(optional) return expression(optional) ; (3)
attr(optional) return braced-init-list ; (4) (C++11以降)
attr(optional) goto identifier ; (5)
1) break
2) continue
3) オプションの式を持つ return
4) リスト初期化を使用した return
5) goto

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

表明文

契約の表明。

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

[編集] 宣言文

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

block-declaration (1)
1) 詳細は宣言初期化を参照してください。

[編集] try ブロック

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

attr(optional) try compound-statement handler-sequence (1)
1) 詳細はtry ブロックを参照してください。


アトミックブロックと同期ブロック

アトミックブロックと同期ブロックは、トランザクショナルメモリを提供します。

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) 同期ブロック、すべての同期ブロックと単一の全順序で実行されます。
2) 例外で中断するアトミックブロック
3) 例外でロールバックするアトミックブロック
4) 例外でコミットするアトミックブロック
(TM TS)

[編集] 部分文

文の部分文 (substatement) とは、以下のいずれかです。

  • ラベル付き文の場合、その statement
  • 複文の場合、その statement... のいずれかの文。
  • 選択文の場合、その statement または compound-statement(C++23から) のいずれか。
  • 反復文の場合、その statement

S1 が文 S2囲む (encloses) とは、以下のいずれかの条件が満たされる場合です。

  • S2S1 の部分文である。
  • S1 が選択文または反復文であり、S2S1init-statement である。
  • S1try ブロックであり、S2 がその compound-statement であるか、またはその handler-seq 内のいずれかのハンドラcompound-statement である。
  • S1 が文 S3 を囲み、かつ S3S2 を囲む。

S1 が文 S2囲まれている (is enclosed by) とは、S2S1 を囲む場合です。

[編集] 関連項目

C言語の文のドキュメント
English 日本語 中文(简体) 中文(繁體)