式
式は計算内容を指示する演算子とその被演算子の並びです。
式の評価は結果を生成したり (例えば 2+2 の評価は結果 4 を生成します)、副作用を発生させたり (std::printf("%d",4) の評価は標準出力に文字 '4' を表示します) します。
目次 |
[編集] 一般
[編集] 演算子
一般的な演算子 | ||||||
---|---|---|---|---|---|---|
代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバアクセス | その他 |
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
特殊な演算子 | ||||||
static_cast は型を別の関連する型に変換します。 |
- 演算子の優先順位は演算子が引数に束縛される順序を定義します。
- 代替表現はいくつかの演算子のための代替となる綴りです。
- 演算子オーバーロードはユーザ定義クラスを用いる演算子の動作を指定できるようにします。
[編集] 変換
- 標準変換 — ある型から別の型への暗黙の変換
-
const_cast
変換 -
static_cast
変換 -
dynamic_cast
変換 -
reinterpret_cast
変換 - 明示的なキャスト — C スタイルのキャスト記法および関数記法を用いた変換
- ユーザ定義変換 — ユーザ定義クラスからの変換を指定できるようにします
[編集] メモリ確保
[編集] その他
[編集] 一次式
あらゆる演算子の被演算子は他の式または一次式です (例えば 1+2*3 では演算子 + の被演算子は部分式 2*3 と一次式 1 です)。
一次式は以下のいずれかです。
括弧内のあらゆる式も一次式に分類されます。 これは括弧がいかなる演算子よりも高い優先順位を持つことを保証します。 括弧は値、型、および値カテゴリを維持します。
[編集] リテラル
リテラルはソースコード中に埋め込まれた定数値を表す C++ プログラムのトークンです。
- char または wchar_t
- char16_t または char32_t (C++11以上)
- char8_t (C++20以上)
- const char[] または const wchar_t[]
- const char16_t[] または const char32_t[] (C++11以上)
- const char8_t[] (C++20以上)
- ブーリアンリテラルは bool 型の値、すなわち true および false です。
-
nullptr
はヌルポインタ値を表すポインタリテラルです。 (C++11以上) - ユーザ定義リテラルはユーザ指定の型の定数値です。 (C++11以上)
[編集] 未評価式
演算子 typeid
、 sizeof
、 noexcept
および decltype
(C++11以上) の被演算子は評価されない式です (それらが多相 glvalue であり typeid
の被演算子である場合を除きます)。 これらの演算子はその被演算子のコンパイル時の性質を問い合わせるだけであるためです。 そのため、 std::size_t n = sizeof(std::cout << 42); はコンソール出力を行いません。
未評価の被演算子は、構文的にはより大きな式の被演算子であるとしても、完全式であると見なされます (例えば、これは sizeof(T()) がアクセス可能な |
(C++14以上) |
requires 式も未評価式です。 |
(C++20以上) |
[編集] 値を破棄する式
値を破棄する式は副作用だけのための使用される式です。 そのような式から計算された値は破棄されます。 そのような式には、あらゆる式文、組み込みのコンマ演算子の左側の被演算子、および void 型にキャストするキャスト式の被演算子が含まれます。
配列からポインタおよび関数からポインタへの変換は値を破棄する式によって計算される値に適用されることはありません。 左辺値から右辺値への変換は、式が volatile 修飾された glvalue であり、以下の形式のいずれか (組み込みの意味でなければなりません) (括弧で囲まれていても構いません) である場合にのみ、適用されます。
- id 式
- 配列添字式
- クラスメンバアクセス式
- 間接参照
- メンバポインタ操作
- 第2引数および第3引数がどちらもこれらの式である条件式
- 右側の被演算子がこれらの式であるコンマ演算子
さらに、その左辺値が volatile 修飾されたクラス型の場合は、結果の右辺値一時オブジェクトを初期化するために volatile コピーコンストラクタが要求されます。
(行われる可能性があるあらゆる左辺値から右辺値への変換の後) 式が void でない prvalue である場合は、一時具体化が発生します。
|
(C++17以上) |