-4

#define MIN (A,B) ((A)<(B)?(A):(B))また#define MIN (A,B) ((A < B)? A : B )

答えを 1 つ選んでください。その理由は?!

4

4 に答える 4

6

この式を考えてみましょう:

int c = MIN(x == y, 1);

試してみましょう#define MIN (A,B) ((A < B) ? A : B )

C では、==演算子の優先順位は<(x == y < zと同等ですx == (y < z)) よりも低いため、次のようになります。

int c = MIN (x == (y < 1) ? x == y : 1)

2 番目の式を使用する場合... 間違っているので、最初の形式の方が適切です。

念のために試してみましょう#define MIN (A,B) ((A) < (B) ? (A) : (B))...

ここにある

int c = MIN ((x == y) < (1) ? (x == y) : (1))

ずっといい!

結局、どちらも「悪い」ので、

int c = MIN(++x, 1);

++x2回評価されます(比較<で1回、結果として三項演算子によって「選択」された場合に1回)

int c = MIN ((++x) < (1) ? (++x) : (1))
于 2013-08-02T13:24:12.913 に答える
2

私の個人的な好みは次のとおりです。

inline int min(int a, int b) 
{
   return (a > b)?b:a;
}

これははるかに安全で、余分な括弧を必要とせず、次のようなことをしても「爆発」しません:

x = min(x++, y++); 
于 2013-08-02T13:29:22.813 に答える
2

個人的には、どちらも使用しません。 のような表現はMIN(++a, ++b)(二重評価のために) 失敗する可能性があるためです。

于 2013-08-02T13:22:42.687 に答える
0

A または B はネストされたコマンドである可能性があるため、前者。2 つのマクロがこれをどのように展開するかを考えてみましょう。

int i = MIN(3+1,2);
于 2013-08-02T13:22:15.600 に答える