名前空間
変種
操作

評価順

提供: cppreference.com
< cpp‎ | language

 
 
C + +言語
一般的なトピック
Original:
General topics
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
フロー制御
Original:
Flow control
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
条件付き実行文
Original:
Conditional execution statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
繰り返し文
Original:
Iteration statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
文をジャンプします
Original:
Jump statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
機能します
Original:
Functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
関数の宣言
ラムダ関数の宣言
関数テンプレート
の歴史。インライン指定
例外仕様 (廃止予定)
noexcept指定子 (C++11)
例外
Original:
Exceptions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
名前空間
Original:
Namespaces
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
タイプ
Original:
Types
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
decltype specifier (C++11)
指定子
Original:
Specifiers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
CV指定
貯蔵期間指定
constexprの指定子 (C++11)
自動指定 (C++11)
alignas指定子 (C++11)
初期化
Original:
Initialization
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
リテラル
Original:
Literals
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Original:
Expressions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
値カテゴリ
評価の順序
代替表現
ユーティリティ
Original:
Utilities
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
タイプ
Original:
Types
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
typedef declaration
型の別名宣言 (C++11)
属性 (C++11)
キャストします
Original:
Casts
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
暗黙の型変換
const_cast conversion
static_cast conversion
dynamic_cast conversion
reinterpret_cast conversion
Cスタイルキャストと機能
メモリの割り当て
Original:
Memory allocation
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
クラス
Original:
Classes
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
クラス固有の機能特性
Original:
Class-specific function properties
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
明示 (C++11)
静的
特殊なメンバ関数
Original:
Special member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
テンプレート
Original:
Templates
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
クラステンプレート
関数テンプレート
テンプレートの特殊化
パラメーターパック (C++11)
その他
Original:
Miscellaneous
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
インラインアセンブリ
 

C++のあらゆる演算子のオペランド、関数呼出しの引数、また式の中の入れ子になった式の評価順は、以下に示したルールに該当する場合を除き、いかなる場合も定義されません。コンパイラはあらゆる順番で式を評価でき、また同じ式が別の場所で再度評価される場合においても別の順番で評価することが許されます。

C++では、「左から右」「右から左」といった評価順の概念はありません。例えばa + b + c cは最初に評価される可能性もありますし、最後もしくは a bと同時に評価される可能性もあります。

目次

[編集] Sequenced-before規則(C++11およびそれ以降)

[編集] 定義

[編集] 評価

各式、及び式の一部に対してコンパイラが行う評価は次の2種類となります:

  • 値の計算: 式によって求まる値の計算。これにはオブジェクトのアイデンティティの決定が伴う場合(glvalueの評価。式がオブジェクトへの参照を返す場合)と以前オブジェクトに代入された値を読む場合(prvalueの評価。式が数値やその他の値を返す場合)があります。
  • 副作用: volatile glvalueで示されるオブジェクトの読み書き、その他のオブジェクトへの書き込み、ライブラリI/O関数の呼出し、あるいは上に示した操作のいずれかを行う関数の呼出しによって生じます。

[編集] 評価順

評価順は、「AがBに先行する(sequenced-before)」という、非対称で推移的な二項関係によって式の各評価の間で単一のスレッドの範囲内で順序付けされます(アトミック型が評価の対象となる場合、std::memory_orderによってこの関係がスレッドを超えて定義される場合があります)。

  • 「AがBに先行する」とき、Aの評価はBの評価が開始する前に完了します。
  • 「AがBに先行しない」が「BがAに先行する」とき、Bの評価はAの評価が開始する前に完了します。
  • 「AがBに先行しない」が「BがAに先行しない」とき、2つの可能性が生じます
    • AとBの評価が順序付けされない場合。この場合、AとBの評価はいかなる順序でも評価される可能性があります。AとBの評価が同時に行われる可能性も存在します。ただし、評価は単一の実行スレッドの範囲で行われます。具体的に言うと、AとBを評価するための命令が交互に混じる可能性があります。
    • AとBの評価が順序付けされるが評価順が不定である場合。この場合AとBの評価順は予測できませんが、同時に評価されることはありません。同じ式が後で再度評価されるときに同じ順序で評価されるとは限りません。

[編集] 規則

1) Full expression (他の式の一部でない式。その大部分は式ステートメントである) のすべての値の計算と副作用は次のfull expressionに先行します。

2) あらゆる演算子のオペランドの値の計算は、そのオペランドの結果の値の計算に先行します。副作用についてはこの限りではありません。

3) 関数呼出し式の、引数のすべての値の計算と副作用は、関数の本体の全ての式とステートメントの実行に先立って評価されます。インライン関数であるかどうかに関わらず、この規則は適用されます。また、明示的に関数呼出し構文が使用されているかどうかに関わらず、この規則は適用されます。

4) 組み込みポストインクリメント・ポストデクリメント演算子の値の計算はその副作用の評価に先行します。

5) 組み込みプリインクリメント・プリデクリメント演算子の副作用の評価は、値の計算に先行します。これは組み込みプリインクリメント・プリデクリメント演算子が複合代入演算子として定義されている為です。

6) 組み込みAND演算子&&とOR演算子||の左辺で行われる全ての値の評価と副作用は右辺で行われる値の評価と副作用の全てに先行します。

7) ?:演算子の最初のオペランドで行われる全ての値の評価と副作用は2番目、3番目のオペランドで行われる値の評価と副作用の全てに先行します。

8) 組み込み代入演算子の副作用(左辺のオペランドの更新)と全ての組み込み複合代入演算子の副作用は、その左辺と両辺の値の計算の後に評価され、その演算子の値の計算(更新されたオブジェクトへの参照の取得)の前に評価されます。

9) 組み込みカンマ演算子,の左辺の全ての値の計算と副作用は右辺の値の計算と副作用の全てに対し先行します。

10) List initializationにおいて、ある初期化節の全ての値の計算と副作用は、その後にある初期化節の値の計算と副作用の全てに先行します。

11) 順序付けされていない2つの関数呼出しは、順序付けされますが、評価順は不定です。プログラムは、その2つの関数呼出しで呼び出される関数の命令が混ぜて実行されたのではなく別個に実行されたのと同様に振る舞います。

12) 割り当て関数(operator new)への呼出しとnew式のコンストラクタの式の間の評価順は不定です。

[編集] 未定義動作

1) あるオブジェクトに対する2つの副作用が順序付けされていない場合、未定義動作となります。

i = ++i + i++; // 未定義動作
i = i++ + 1; // 未定義動作 (i = ++i + 1は問題ありません)
f(++i, ++i); // 未定義動作
f(i = -1, i = -1); // 未定義動作

2) あるオブジェクトに対する副作用の評価と値の計算が順序付けされていない場合、未定義動作となります。

cout << i << i++; // 未定義動作
a[i] = i++; // 未定義動作

[編集] シーケンスポイント規則 (C++11以前)

[編集] 定義

式の評価は副作用を生じる可能性があります:ライブラリのI / O関数を呼び出すこと、またはこれらのいずれかの操作を行う関数を呼び出し、オブジェクトを変更すると、揮発性左辺値によって指定されたオブジェクトへのアクセス.
Original:
Evaluation of an expression might produce side effects, which are: accessing an object designated by a volatile lvalue, modifying an object, calling a library I/O function, or calling a function that does any of those operations.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
シーケンスポイントはシーケンスの前の評価からのすべての副作用が完了している実行シーケンス内の点であり、その後の評価の副作用は開始されません.
Original:
A sequence point is a point in the execution sequence where all side effects from the previous evaluations in the sequence are complete, and no side effects of the subsequent evaluations started.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集] 規則

1)
各フル式(通常は、セミコロンで)の末尾のシーケンスポイントがあります
Original:
There is a sequence point at the end of each full expression (typically, at the semicolon)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
2)
(関数がインライン展開されているか否かの関数呼び出し構文が使用されたかどうか)関数を呼び出すときは、内の任意の式や文の実行前に行われるすべての関数の引数の評価の後にシーケンスポイントは(もしあれば)がある関数本体
Original:
When calling a function (whether or not the function is inline and whether or not function call syntax was used), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
3)
関数の戻り値のコピーを行った後と関数外の任意の式の実行前にシーケンスポイントがあります.
Original:
There is a sequence point after the copying of a returned value of a function and before the execution of any expressions outside the function.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
4)
関数の実行が開始されると呼び出された関数の実行が(機能がインターリーブすることはできません)が完了するまで、呼び出し元の関数からの式は評価されません
Original:
Once the execution of a function begins, no expressions from the calling function are evaluated until execution of the called function has completed (functions cannot be interleaved)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
5)
ビルトイン(非オーバーロード)の演算子を使用して、次の4つの各式の評価では、式の評価a後のシーケンスポイントがある.
Original:
In the evaluation of each of the following four expressions, using the built-in (non-overloaded) operators, there is a sequence point after the evaluation of the expression a.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

a && b
a || b
a ? b : c
a , b

[編集] 未定義動作

1)
前と次のシーケンスポイント間のスカラーオブジェクトは、式の評価では最大で1回修正され、その格納された値を持たなければならない.
Original:
Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

i = ++i + i++; // undefined behavior
i = i++ + 1; // undefined behavior
i = ++i + 1; // undefined behavior (well-defined in C++11)
++ ++i; // undefined behavior (well-defined in C++11)
f(++i, ++i); // undefined behavior
f(i = -1, i = -1); // undefined behavior

2)
前と次のシーケンスポイント、式の評価によって修正されたスカラオブジェクトの前の値との間でのみ、格納される値を決定するためにアクセスされなければならない.
Original:
Between the previous and next sequence point , the prior value of a scalar object that is modified by the evaluation of the expression, shall be accessed only to determine the value to be stored.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

cout << i << i++; // undefined behavior
a[i] = i++; // undefined bevahior

[編集] 参考

  • 演算子の優先順位式は、そのソース·コード表現から構築される方法を定義している.
    Original:
    演算子の優先順位 which defines how expressions are built from their source code representation.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • Cプログラミング言語の評価の順序.
    Original:
    評価の順序 in the C programming language.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.