4
#include <iostream>
#include <cmath>

#define max(x,y) (x)>(y)? (x): (y)

int main() {
  int i = 10;
  int j = 5;
  int k = 0;
  k = max(i++,++j);
  std::cout << i << "\t" << j << "\t" << k << std::endl;
}
4

2 に答える 2

12

いいえ、そうではありません。

この場合、最初のオペランド (条件) を評価した直後に?:演算子がシーケンス ポイントを持ち、その後 2 つの式 (2 番目または 3 番目のオペランド) のうちの 1 つだけが評価されるという事実によって、状況は救われます。あなたのコードはと同等です

...
bool c = i++ > ++j;
k = c ? i++ : ++j;
...

ここには未定義の動作はありません。

于 2010-02-27T04:57:50.390 に答える
4

うーん、確かに色々と問題はありますね。

  • max は実際に min を計算しています
  • インクリメント演算子は、マクロを使用しているため、どの選択肢を選択しても2倍になります
  • 接尾辞/接頭辞のインクリメントを使用すると、混乱するだけですが、問題にはあまり関係がありません。

このコードは実行するたびに同じ結果を生成するため、未定義ではありません。試合中:

i = 11
k = 7
j = 7

これは悪い宿題の問題のように聞こえます。:)

于 2010-02-27T05:02:25.900 に答える