名前空間
変種
操作

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
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++ プログラムのトークンです。

  • 整数リテラルは整数型の10進数、8進数、16進数または2進数 (C++14およびそれ以降)の数値です。
  • 文字リテラルchar, char16_t, char32_t (C++11およびそれ以降) または wchar_t 型の個々の文字です。
  • 浮動小数点リテラルfloat, double または long double 型の値です。
  • 文字列リテラルconst char[], const char16_t[], const char32_t[] (C++11およびそれ以降) または const wchar_t[] 型の文字の並びです。
  • ブーリアンリテラルbool 型の値、すなわち true および false です。
  • nullptr はヌルポインタ値を表すポインタリテラルです。 (C++11およびそれ以降)
  • ユーザ定義リテラルはユーザ指定の型の定数値です。 (C++11およびそれ以降)

[編集] 未評価式

演算子 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引数がどちらもこれらの式である条件式
  • 右側の被演算子がこれらの式であるコンマ演算子
さらに、式がクラス型の場合、結果の rvalue の一時オブジェクトを初期化するために volatile なコピーコンストラクタが要求されます。 (C++17以前)

(行われる可能性があるあらゆる左辺値から右辺値への変換の後) 式が prvalue である場合、一時的な実体化が発生します。 元の glvalue が volatile 修飾されたクラス型の場合、結果の rvalue の一時オブジェクトを初期化するために volatile なコピーコンストラクタが要求されます。

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

(C++17およびそれ以降)