我的代码是:-
#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 ......
先感谢您。
我的代码是:-
#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 ......
先感谢您。
总是用括号屏蔽你的宏参数:
#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++)
所以,要小心,也许你需要一个函数