Expressions
式は、 operators とその operands の連続であり、計算を指定するものです。
式の評価は結果を生成する場合があります(例えば、 2 + 2 の評価は結果 4 を生成します)また、副作用を生じる場合があります(例えば、 std:: printf ( "%d" , 4 ) の評価は標準出力に文字 '4' を出力します)。
各C++式は、2つの独立した特性によって特徴付けられます:型と値カテゴリ。
目次 |
一般
- 値カテゴリ (lvalue, rvalue , glvalue, prvalue, xvalue (C++11以降) ) は式をその値によって分類する
- 評価順序 は引数と部分式の中間結果が得られる順序を指定する
演算子
| 共通演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 |
インクリメント
デクリメント |
算術 | 論理 | 比較 |
メンバー
アクセス |
その他 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
関数呼び出し
a ( ... ) |
|
カンマ
a, b |
||||||
|
条件演算子
a ? b : c |
||||||
| 特殊演算子 | ||||||
|
static_cast
関連する型間での変換を行う
|
||||||
- operator precedence は演算子が引数に結合される順序を定義します
- alternative representations は一部の演算子に対する代替表記です
- operator overloading はユーザー定義クラスでの演算子の動作を指定することを可能にします
変換
- 標準変換 ある型から別の型への暗黙的変換
-
const_cast変換 -
static_cast変換 -
dynamic_cast変換 -
reinterpret_cast変換 - 明示的キャスト Cスタイルキャスト表記と関数スタイル表記を使用した変換
- ユーザー定義変換 ユーザー定義クラスからの変換を指定可能にする
メモリ割り当て
その他
基本式
任意の演算子のオペランドは、他の式または基本式となり得ます(例えば、 1 + 2 * 3 において、operator+のオペランドは 部分式 2 * 3 と基本式 1 です)。
一次式は以下のいずれかです:
-
this - リテラル(例: 2 または "Hello, world" )
-
識別子式、以下を含む:
- 適切に宣言された 非修飾識別子 (例: n または cout )
- 適切に宣言された 修飾識別子 (例: std::string::npos )、および
- 宣言子 で宣言される識別子
| (C++26以降) |
| (C++11以降) | |
| (C++17以降) | |
| (C++20以降) |
括弧内の任意の式もまた基本式として分類されます:これは括弧が任意の演算子よりも高い優先順位を持つことを保証します。括弧は値、型、および値カテゴリを保持します。
リテラル
リテラルは、ソースコードに埋め込まれた定数値を表すC++プログラムのトークンです。
- integer literals は整数型の10進数、8進数、16進数または2進数です。
- character literals は型の個々の文字です
-
- char または wchar_t
|
(C++11以降) |
|
(C++20以降) |
-
- const char [ ] または const wchar_t [ ]
|
(C++11以降) |
|
(C++20以降) |
- ブーリアンリテラル は型 bool の値、すなわち true および false です
|
(C++11以降) |
完全式
A 構成要素式 は以下のように定義されます:
- 式の構成要素式は、その式自体である。
- 波括弧で囲まれた初期化子リスト または(括弧で囲まれた可能性のある)式リストの構成要素式は、それぞれのリストの要素の構成要素式である。
-
=で始まる 初期化子 の構成要素式は、 initializer-clause の構成要素式である。
int num1 = 0; num1 += 1; // ケース1: 「num += 1」の構成式は「num += 1」である int arr2[2] = {2, 22} // ケース2: 「{2, 22}」の構成式は // 「2」と「22」である // ケース3: 「= {2, 22}」の構成式は // 「{2, 22}」の構成式である // (つまり「2」と「22」でもある)
immediate subexpressions 式 E の直接部分式は
- E のオペランドを構成する式、
|
(C++14以降) |
|
(C++11以降) |
- E が暗黙的に呼び出す関数呼び出し、または
- E が関数呼び出しであるか、関数を暗黙的に呼び出す場合、その呼び出しで使用される各 デフォルト引数 の構成式。
式 E の 部分式 とは、 E の直接の部分式、または E の直接の部分式の部分式のことです。 ラムダ式の「関数本体」内に現れる式は、ラムダ式の部分式ではないことに注意してください。 (C++11以降)
以下の式は full-expressions(完全式) です:
| (C++20以降) |
|
(C++26以降) |
- 他のいかなる式の部分式でもなく、また何らかの完全式の一部でもない式
言語構文が関数の暗黙的な呼び出しを生成するように定義されている場合、その言語構文の使用はこの定義の目的において式と見なされます。式が現れる言語構文の要件を満たすために式の結果に適用される変換も、完全式の一部と見なされます。
初期化子について、エンティティの初期化の実行 (集約のデフォルトメンバ初期化子の評価を含む) (C++14以降) も完全式の一部と見なされます。
潜在的に評価される式
|
式は以下の場合を除いて 潜在的に評価される : |
(C++11まで) | ||
|
以下の被演算子は 未評価被演算子 であり、評価されない:
式は以下の場合を除いて 潜在的に評価される :
|
(C++11以降) |
潜在的に評価される式は ODR-use です。
|
この節は不完全です
理由:未評価オペランドの例 |
廃棄値式 (Discarded-value expressions)
廃棄値式 は、副作用のみを目的として使用される式です。このような式から計算された値は廃棄されます。これには、あらゆる 式文 の完全式、組み込みのコンマ演算子の左側のオペランド、または型 void へのキャストを行うキャスト式のオペランドが含まれます。
配列からポインタへの変換および関数からポインタへの変換は、破棄値式によって計算される値には適用されません。左辺値から右辺値への変換は、その式が volatile修飾 されたglvalueであり、以下の形式(組み込みの意味が必要で、括弧で囲まれている可能性あり)のいずれかを持つ場合にのみ適用されます:
- id-expression,
- array subscript expression,
- class member access expression,
- indirection,
- pointer-to-member operation,
- conditional expression where both the second and the third operands are one of these expressions,
- comma expression where the right operand is one of these expressions.
さらに、左辺値がvolatile修飾されたクラス型である場合、結果の右辺値一時オブジェクトを初期化するにはvolatileコピーコンストラクタが必要です。
|
式が非voidのprvalueである場合(発生した可能性のあるlvalue-to-rvalue変換の後)、 一時オブジェクト化 が発生します。
コンパイラは、
void
へのキャスト以外の式が
|
(C++17以降) |
式等価性複数の式 e1 , e2 , ..., eN が以下の全ての条件を満たす場合、それらは 式等価 である: e1 が 式等価である e2 と同値であるのは、 e1 と e2 が式等価である場合に限る(これは e2 もまた e1 と式等価であることを意味する)。 |
(C++20以降) |
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用バージョン | 公開時の仕様 | 修正後の仕様 |
|---|---|---|---|
| CWG 1054 | C++98 |
volatile変数への値の代入は、代入結果に適用される
左辺値から右辺値への変換により不要な読み取りが 発生する可能性があった |
破棄値式を導入し、このケースを
変換が必要なケースのリストから 除外する |
| CWG 1343 | C++98 |
集成体初期化におけるデストラクタ呼び出しの
順序規定が不十分だった |
集成体初期化における完全式は
明確に規定される |
| CWG 1383 | C++98 |
破棄値式に左辺値から右辺値への変換が適用される
式のリストにオーバーロードされた演算子も 含まれていた |
組み込みの意味を持つ演算子のみを
対象とする |
| CWG 1576 | C++11 |
破棄値volatile xvalue式に左辺値から右辺値への
変換が適用されなかった |
このケースでも変換を
適用する |
| CWG 2249 | C++98 |
宣言子で宣言される識別子は
識別子式ではなかった |
識別子式である |
| CWG 2431 | C++11 |
参照に束縛される一時オブジェクトのデストラクタ呼び出しが
完全式ではなかった |
完全式である |
関連項目
|
C ドキュメント
for
式
|