2

私のコードは:-

#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である理由を教えてください...

前もって感謝します。

4

3 に答える 3

8

マクロの引数は常に括弧で保護します。

#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

于 2012-07-22T17:16:58.753 に答える
7

引数を括弧で囲む必要があります。

#define sq(x) ((x)*(x)*(x))

括弧がない場合、式は次のように展開されます。

6+5*6+5*6+5

と評価される理由がわかります71

より安全な解決策は、代わりにインライン関数を使用することです。ただし、タイプごとに異なるものを定義する必要があります。マクロの名前を変更した方がわかりやすい場合もあります。

static inline int cube_int (int x) { return x*x*x; }
于 2012-07-22T17:15:43.400 に答える
3

次のようにマクロを定義すると、次のようになります。

#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++)

したがって、注意してください。おそらく関数が必要です

于 2012-07-22T17:18:55.257 に答える