9

更新: ユーザーecatmurによってマークされているように、それはIn C99, is f()+g() undefined or単に unspecified?の複製です。(質問はC99について尋ねますが、答えはC ++では変わりません)。答えは未指定です (どちらの場合も)。


次の C++14 コード フラグメントを検討してください。

int i = 0;
int x() { i++; return i;}
int y() { i++; return i;}
bool z = (x() > y());  // unspecified or undefined ?

の値が指定されていz ないだけですか、それとも未定義の動作ですか?

私の理解によると (私が間違っている場合は修正してください)、種類の式:i++ > i++シーケンスポイントのペア間で同じ変数を2回変更しているため、未定義の動作になりますが、上記の場合はどうなりますか (突然変異が別々に発生する場合)機能) ?

そして、これはどうですか:

bool z = (x() > i++);  // undefined or unspecified now ?
4

2 に答える 2

15

どちらの場合も、値は指定されていませんが、動作は明確に定義されています。[intro.execution] 1.9/15 で指定されているように、関数呼び出しは、それらを呼び出す式の他の評価に関して不定に順序付けられます。

呼び出された関数の本体の実行の前後に特に順序付けされていない呼び出し側関数 (他の関数呼び出しを含む) 内のすべての評価は、呼び出された関数の実行に関して不定に順序付けられます。

そのため、 へのすべてのアクセスは順序付けられi、明確に定義された動作を示しますが、順序は不定であり、値が指定されていません。

于 2015-03-02T18:46:46.777 に答える