关于define的运用有点不太懂?

来源:百度知道 编辑:UC知道 时间:2024/06/13 03:52:27
先看程序:
#include <iostream>
using namespace std;
#define power(x) x*x

int main()
{
cout<<power(2+3+4)<<endl;
system("pause");
return 0;
}
它的返回值为什么会是20
power(2+3+4+1)为什么又会是19了呢
这是怎么来的呢,是不是有什么计算工式呀
我知道power(2+3)=2+2*3+3

望高手指点下, 谢了

#define在这里是定义了一个宏函数,宏函数是单纯的代码替换,这个例子里,就是在power(x)出现的地方用x*x来代替

因此cout<<power(2+3+4)<<endl;被替代以后,实际成为
cout<<2+3+4*2+3+4<<endl;
2+3+4*2+3+4=20

这个就是宏函数的陷阱,所以用宏函数的时候有条规则,在能加括号的地方都加上括号
#define power(x) ((x)*(x))
这样cout<<power(2+3+4)<<endl;就成为
cout<<((2+3+4)*(2+3+4))<<endl;
这样就是想要的结果了

但是这样还不能保证肯定正确,当宏函数出现在++和--运算的时候即使有括号还是会出错

所以C++中推荐用内联函数(inline)来替代宏函数,因为内联函数会检查参数,让其符合函数本来的意图,而不像宏函数只是单纯的代码替换

cout<<power(2+3+4)<<endl;
是这样的,#define就是一种定义,像代数运算一样,但是它只是简单的展开,不考虑优先级的。
power(x)定义为x*x,所以power(2+3+4)扩展开就是2+3+4*2+3+4,先算4*2,然后算加法,结果就是20;

同理对power(2+3+4+1)也是一样的。

另:power(2+3)扩展开并不是2+2*3+3,而是2+3*2+3

需要加小括号~如果按你这样,那么是power(2+3+4)=2+3+4*2+3+4=20;
power (2+3+4+1)=2+3+4+1*2+3+4+1=19 (数学上先乘除后加减。。。)
改成#define power(x) (x)*(x)就好了~

问题一:
2+3+4*2+3+4=20
问题二:2+3+4+1*2+3+4+1=19
对于这样的宏定义计算,直接拿数字相乘就可以了。