Namespaces
Variants

Expressions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

式は、 operators とその operands の連続であり、計算を指定するものです。

式の評価は結果を生成する場合があります(例えば、 2 + 2 の評価は結果 4 を生成します)また、副作用を生じる場合があります(例えば、 std:: printf ( "%d" , 4 ) の評価は標準出力に文字 '4' を出力します)。

各C++式は、2つの独立した特性によって特徴付けられます:型と値カテゴリ。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++専門用語(General, Operators, Conversions, Memory allocation, Literalsなど)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 番号付けや構造は完全に保持されています - 技術文書としての正確性と専門性を維持しています

一般

  • 値カテゴリ (lvalue, rvalue , glvalue, prvalue, xvalue (C++11以降) ) は式をその値によって分類する
  • 評価順序 は引数と部分式の中間結果が得られる順序を指定する

演算子

翻訳の説明: - 「comma」は「カンマ」と翻訳しました - HTMLタグと属性はそのまま保持しています - ` `タグ内のC++コード「a, b」は翻訳せずにそのまま保持しています - すべての書式設定と構造を正確に維持しています
共通演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバー
アクセス
その他

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 [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

関数呼び出し

a ( ... )
カンマ

a, b
条件演算子

a ? b : c
特殊演算子

static_cast 関連する型間での変換を行う
dynamic_cast 継承階層内での変換を行う
const_cast cv 修飾子の追加または削除を行う
reinterpret_cast 無関係な型間での変換を行う
C-style cast static_cast const_cast reinterpret_cast の組み合わせで型変換を行う
new 動的記憶域期間を持つオブジェクトを作成する
delete new式で作成されたオブジェクトを破棄し、取得したメモリ領域を解放する
sizeof 型のサイズを問い合わせる
sizeof... pack のサイズを問い合わせる (C++11以降)
typeid 型の型情報を問い合わせる
noexcept 式が例外を投げる可能性があるかチェックする (C++11以降)
alignof 型のアライメント要件を問い合わせる (C++11以降)

変換

メモリ割り当て

その他

基本式

任意の演算子のオペランドは、他の式または基本式となり得ます(例えば、 1 + 2 * 3 において、operator+のオペランドは 部分式 2 * 3 と基本式 1 です)。

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

(C++26以降)
(C++11以降)
(C++17以降)
(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以降)
(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以降)
  • Eが ラムダ式 である場合、コピーによってキャプチャされたエンティティの初期化およびキャプチャの初期化子の構成式、
(C++11以降)
  • E が暗黙的に呼び出す関数呼び出し、または
  • E が関数呼び出しであるか、関数を暗黙的に呼び出す場合、その呼び出しで使用される各 デフォルト引数 の構成式。

E 部分式 とは、 E の直接の部分式、または E の直接の部分式の部分式のことです。 ラムダ式の「関数本体」内に現れる式は、ラムダ式の部分式ではないことに注意してください。 (C++11以降)

以下の式は full-expressions(完全式) です:

(C++20以降)
(C++26以降)
  • 他のいかなる式の部分式でもなく、また何らかの完全式の一部でもない式

言語構文が関数の暗黙的な呼び出しを生成するように定義されている場合、その言語構文の使用はこの定義の目的において式と見なされます。式が現れる言語構文の要件を満たすために式の結果に適用される変換も、完全式の一部と見なされます。

初期化子について、エンティティの初期化の実行 (集約のデフォルトメンバ初期化子の評価を含む) (C++14以降) も完全式の一部と見なされます。

潜在的に評価される式

式は以下の場合を除いて 潜在的に評価される

(C++11まで)

以下の被演算子は 未評価被演算子 であり、評価されない:

(C++20以降)

式は以下の場合を除いて 潜在的に評価される

  • 未評価被演算子である場合、または
  • 未評価被演算子の部分式である場合。
(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 へのキャスト以外の式が [[ nodiscard ]] 宣言された値を破棄する場合に警告を発行することがあります。

(C++17以降)

式等価性

複数の式 e1 , e2 , ..., eN が以下の全ての条件を満たす場合、それらは 式等価 である:

  1. 同じ効果を持つ。
  2. 全てが 定数部分式 であるか、または全てがそうでないかのいずれかである。
  3. 全てが noexcept であるか、または全てがそうでないかのいずれかである。

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 参照に束縛される一時オブジェクトのデストラクタ呼び出しが
完全式ではなかった
完全式である

関連項目