#define MIN (A,B) ((A)<(B)?(A):(B))
また#define MIN (A,B) ((A < B)? A : B )
答えを 1 つ選んでください。その理由は?!
#define MIN (A,B) ((A)<(B)?(A):(B))
また#define MIN (A,B) ((A < B)? A : B )
答えを 1 つ選んでください。その理由は?!
この式を考えてみましょう:
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);
++x
2回評価されます(比較<
で1回、結果として三項演算子によって「選択」された場合に1回)
int c = MIN ((++x) < (1) ? (++x) : (1))
私の個人的な好みは次のとおりです。
inline int min(int a, int b)
{
return (a > b)?b:a;
}
これははるかに安全で、余分な括弧を必要とせず、次のようなことをしても「爆発」しません:
x = min(x++, y++);
個人的には、どちらも使用しません。 のような表現はMIN(++a, ++b)
(二重評価のために) 失敗する可能性があるためです。
A または B はネストされたコマンドである可能性があるため、前者。2 つのマクロがこれをどのように展開するかを考えてみましょう。
int i = MIN(3+1,2);