#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;
}
質問する
168 次
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 に答える