Statements
文 は、C++プログラムの断片であり、順番に実行されます。任意の関数の本体は文のシーケンスです。例えば:
int main() { int n = 1; // 宣言文 n = n + 1; // 式文 std::cout << "n = " << n << '\n'; // 式文 return 0; // return文 }
C++には以下の種類の文が含まれます:
| (C++26以降) |
| (TM TS) |
目次 |
ラベル付きステートメント
ラベル付きステートメントは、制御フローの目的でステートメントにラベルを付けます。
| ラベル文 | |||||||||
| label | - | 文に適用されるラベル(後述の定義を参照) |
| statement | - | ラベルが適用される文。ラベル付き文自体も可能であり、複数のラベルを付与できる |
ラベル
label は次のように定義されます
attr
(オプション)
identifier
:
|
(1) | ||||||||
attr
(オプション)
case
constexpr
:
|
(2) | ||||||||
attr
(オプション)
default:
|
(3) | ||||||||
|
属性 シーケンス 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以降) | |||||||
反復文
反復文は、一部のコードを繰り返し実行します。
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以降) | |||||||
ジャンプ文
jump文は無条件に制御フローを転送します。
attr
(オプション)
break;
|
(1) | ||||||||
attr
(オプション)
continue;
|
(2) | ||||||||
attr
(オプション)
return
expression
(オプション)
;
|
(3) | ||||||||
attr
(オプション)
return
braced-init-list
;
|
(4) | (C++11以降) | |||||||
attr
(オプション)
goto
identifier
;
|
(5) | ||||||||
注: すべてのジャンプ文において、ループ外、ブロック外、または自動記憶域期間を持つ初期化済み変数を越えた後方へのジャンプは、ジャンプ元のスコープにあるがジャンプ先のスコープにはない自動記憶域期間を持つオブジェクトの破棄を伴います。複数のオブジェクトが初期化されている場合、破棄の順序は初期化の順序と逆になります。
アサーション文契約アサーション
1)
contract_assert
文
|
(C++26以降) | |||||||||||||||||||||||
宣言文
宣言文は1つ以上の識別子をブロックに導入します。
| block-declaration | (1) | ||||||||
try ブロック
A try ブロックは、他のステートメントの実行中にスローされた例外をキャッチします。
attr
(optional)
try
compound-statement handler-sequence
|
(1) | ||||||||
Atomicおよびsynchronizedブロックatomicおよびsynchronizedブロックは トランザクショナルメモリ を提供します。
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
|