名前空間
変種
操作

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

式は計算内容を指示する演算子とその被演算子の並びです。

式の評価は結果を生成したり (例えば 2+2 の評価は結果 4 を生成します)、副作用を発生させたり (std::printf("%d",4) の評価は標準出力に文字 '4' を表示します) します。

目次

[編集] 一般

  • 値カテゴリ (lvalue, rvalue, glvalue, prvalue, xvalue) は式をその値で分類します。
  • 引数および部分式の評価順序は中間結果が取得される順序を規定します。

[編集] 演算子

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
? :

特殊な演算子

static_cast は型を別の関連する型に変換します。
dynamic_cast は継承階層内で変換します。
const_castcv 修飾子を追加または削除します。
reinterpret_cast は型を無関係の型に変換します。
C スタイルのキャストstatic_cast, const_cast, reinterpret_cast の混合によって型を別の型に変換します。
new は動的記憶域期間を持つオブジェクトを作成します。
delete は以前に new 式によって作成されたオブジェクトを破棄し、取得したメモリ領域を解放します。
sizeof は型のサイズを照会します。
sizeof...パラメータパックのサイズを照会します。 (C++11以上)
typeid は型の型情報を照会します。
noexcept は式が例外を投げることができるかどうかを調べます。 (C++11以上)
alignof は型のアライメント要件を照会します。 (C++11以上)

[編集] 変換

[編集] メモリ確保

  • new 式はメモリを動的に確保します。
  • delete 式はメモリを動的に解放します。

[編集] その他

[編集] 一次式

あらゆる演算子の被演算子は他の式または一次式です (例えば 1+2*3 では演算子 + の被演算子は部分式 2*3 と一次式 1 です)。

一次式は以下のいずれかです。

1) リテラル (例えば 2"Hello, world")
2) 適切に宣言された非修飾識別子 (例えば ncout)
3) 適切に宣言された修飾識別子 (例えば std::string::npos)
4) ラムダ式 (C++11以上)
5) 畳み込み式 (C++17以上)
6) requires 式 (C++20以上)

括弧内のあらゆる式も一次式に分類されます。 これは括弧がいかなる演算子よりも高い優先順位を持つことを保証します。 括弧は値、型、および値カテゴリを維持します。

[編集] リテラル

リテラルはソースコード中に埋め込まれた定数値を表す 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以上)

[編集] 未評価式

演算子 typeidsizeofnoexcept および decltype (C++11以上) の被演算子は評価されない式です (それらが多相 glvalue であり typeid の被演算子である場合を除きます)。 これらの演算子はその被演算子のコンパイル時の性質を問い合わせるだけであるためです。 そのため、 std::size_t n = sizeof(std::cout << 42); はコンソール出力を行いません。

未評価の被演算子は、構文的にはより大きな式の被演算子であるとしても、完全式であると見なされます (例えば、これは sizeof(T()) がアクセス可能な T::~T を要求することを意味します)。

(C++14以上)

requires 式も未評価式です。

(C++20以上)

[編集] 値を破棄する式

値を破棄する式は副作用だけのための使用される式です。 そのような式から計算された値は破棄されます。 そのような式には、あらゆる式文、組み込みのコンマ演算子の左側の被演算子、および void 型にキャストするキャスト式の被演算子が含まれます。

配列からポインタおよび関数からポインタへの変換は値を破棄する式によって計算される値に適用されることはありません。 左辺値から右辺値への変換は、式が volatile 修飾された glvalue であり、以下の形式のいずれか (組み込みの意味でなければなりません) (括弧で囲まれていても構いません) である場合にのみ、適用されます。

  • id 式
  • 配列添字式
  • クラスメンバアクセス式
  • 間接参照
  • メンバポインタ操作
  • 第2引数および第3引数がどちらもこれらの式である条件式
  • 右側の被演算子がこれらの式であるコンマ演算子

さらに、その左辺値が volatile 修飾されたクラス型の場合は、結果の右辺値一時オブジェクトを初期化するために volatile コピーコンストラクタが要求されます。

(行われる可能性があるあらゆる左辺値から右辺値への変換の後) 式が void でない prvalue である場合は、一時具体化が発生します。

void へのキャスト以外の式が [[nodiscard]] 宣言された値を破棄するとき、コンパイラは警告を発行することがあります。

(C++17以上)