文
文 (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) | ||||||||
|
属性シーケンス 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から) | |||||||
[編集] 反復文
反復文は、あるコードを繰り返し実行します。
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以降) | |||||||
[編集] ジャンプ文
ジャンプ文は、無条件に制御フローを移します。
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)
contract_assert 文。 |
(C++26以降) | |||||||||||||||||||||||
[編集] 宣言文
宣言文は、1つ以上の識別子をブロックに導入します。
| block-declaration | (1) | ||||||||
[編集] try ブロック
try ブロックは、他の文を実行中にスローされた例外をキャッチします。
attr(optional) try compound-statement handler-sequence |
(1) | ||||||||
アトミックブロックと同期ブロックアトミックブロックと同期ブロックは、トランザクショナルメモリを提供します。
1) 同期ブロック、すべての同期ブロックと単一の全順序で実行されます。
2) 例外で中断するアトミックブロック
3) 例外でロールバックするアトミックブロック
4) 例外でコミットするアトミックブロック
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[編集] 部分文
文の部分文 (substatement) とは、以下のいずれかです。
- ラベル付き文の場合、その statement。
- 複文の場合、その statement... のいずれかの文。
- 選択文の場合、その statement または compound-statement(C++23から) のいずれか。
- 反復文の場合、その statement。
文 S1 が文 S2 を囲む (encloses) とは、以下のいずれかの条件が満たされる場合です。
- S2 が S1 の部分文である。
- S1 が選択文または反復文であり、S2 が S1 の init-statement である。
- S1 が try ブロックであり、S2 がその compound-statement であるか、またはその handler-seq 内のいずれかのハンドラの compound-statement である。
- S1 が文 S3 を囲み、かつ S3 が S2 を囲む。
文 S1 が文 S2 に囲まれている (is enclosed by) とは、S2 が S1 を囲む場合です。
[編集] 関連項目
| C言語の文のドキュメント
|