私のコードは:-
#include<stdio.h>
#include<conio.h>
#define sq(x) x*x*x
void main()
{
printf("Cube is : %d.",sq(6+5));
getch();
}
出力は次のとおりです。
Cube is : 71.
出力が1331ではなく71である理由を教えてください...
前もって感謝します。
私のコードは:-
#include<stdio.h>
#include<conio.h>
#define sq(x) x*x*x
void main()
{
printf("Cube is : %d.",sq(6+5));
getch();
}
出力は次のとおりです。
Cube is : 71.
出力が1331ではなく71である理由を教えてください...
前もって感謝します。
マクロの引数は常に括弧で保護します。
#define sq(x) ((x) * (x) * (x))
括弧なしの評価を考えてみましょう:
6 + 5 * 6 + 5 * 6 + 5
*
は よりも優先順位が高いことを思い出してください。つまり+
、次のようになります。
6 + 30 + 30 + 5 = 71;
まだ知らない場合は、優先順位の規則を理解してください: http://en.cppreference.com/w/cpp/language/operator_precedence
引数を括弧で囲む必要があります。
#define sq(x) ((x)*(x)*(x))
括弧がない場合、式は次のように展開されます。
6+5*6+5*6+5
と評価される理由がわかります71
。
より安全な解決策は、代わりにインライン関数を使用することです。ただし、タイプごとに異なるものを定義する必要があります。マクロの名前を変更した方がわかりやすい場合もあります。
static inline int cube_int (int x) { return x*x*x; }
次のようにマクロを定義すると、次のようになります。
#define sq(x) x*x*x
そしてそれを呼び出します:
sq(6+5);
プリプロセッサは次のコードを生成します。
6+5*6+5*6+5
これは、演算子の優先順位により、次と同等です。
6+(5*6)+(5*6)+5
そのため、マクロの引数は括弧で囲む必要があります。
#define sq(x) (x)*(x)*(x)
したがって、プリプロセッサの出力は次のようになります。
(6+5)*(6+5)*(6+5)
ただし、(i++) などの副作用を伴ういくつかの引数を渡す場合:
sq(i++)
次のように拡張されます。
(i++)*(i++)*(i++)
したがって、注意してください。おそらく関数が必要です