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.

现在请帮我弄清楚为什么输出是 71 而不是 1331 ......

先感谢您。

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 回答