次は未定義または実装定義です:
int x = 0;
printf("%d%d", ++x, x);
引数を評価する順序は指定されていないため、次のようになります。
++x
が最初に評価される場合、これは出力し11
ます。x
が最初に評価される場合、出力され10
ます。
次は未定義または実装定義です:
int x = 0;
printf("%d%d", ++x, x);
引数を評価する順序は指定されていないため、次のようになります。
++x
が最初に評価される場合、これは出力し11
ます。x
が最初に評価される場合、出力され10
ます。printf("%d%d", ++x, x);
これは、C++では明らかに未定義の動作です。
(C ++ 11、1.9p15)「スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用、または同じスカラーオブジェクトの値を使用した値の計算に比べて順序付けされていない場合、動作は定義されていません。」
C(強調鉱山)についても同じです:
(C99、6.5.p2)「前のシーケンスポイントと次のシーケンスポイントの間で、オブジェクトは、式の評価によって、保存された値を最大で1回変更する必要があります。72)さらに、前の値は、値を決定するためにのみ読み取られるものとします。保存された.73"
C11の文言はC++11と同様であることに注意してください。
(C11、6.5p2)「スカラーオブジェクトの副作用が、同じスカラーオブジェクトの異なる副作用、または同じスカラーオブジェクトの値を使用した値の計算に比べて順序付けされていない場合、動作は定義されていません。」