宏定义就是直接替换,直接替换!
宏定义的直接替换,就是最直接的替换
下面以两个宏定义的简单函数为例,注意f(x) 和g(x)表达式的不同,前者没有括号,后者有括号。
#include <iostream>
#define f(x) x+x
#define g(x) (x+x)
int main() {
int f = f(1) * 2;
int g = g(1) * 2;
std::cout << "f: " << f << " g: " << g << std::endl;
// 运行结果:f: 3 g: 4
// f = f(1) * 2,将f(1)直接替换成1 + 1,即f = 1 + 1 * 2 = 3
// g = g(1) * 2,将g(1)直接替换成(1 + 1),即g = (1 + 1) * 2 = 4
int a = f(4 + 6)/g(2 + 1);
std::cout<<a<<std::endl;
// 运行结果:15
// a = f(4 + 6)/g(2 + 1),这里的4 + 6或2 + 1,即参数x,
// 直接替换,那么a = 4 + 6 + 4 + 6 / (2 + 1 + 2 + 1) = 14 + 6 / 6 = 15
return 0;
}
下面是在CLion上对这段代码的显示,也可以从中看出一些东西。留意看一下调用f(x)和g(x)的地方,都会有一个灰色的 x:
x就是形参,后面的1也罢 ,4 + 6也好都是实参。
还有一点值得说明一下,直接替换就是直接替换,不要进行任何其他的操作,例如f(4 +6)/g(2 + 1),千万不要直接把4 + 6当作10,2+ 1当作3,否则就成了10 + 10 / (3 + 3),显然是不正确的。那如果f(x) 和g(x)定义如下:
#include <iostream>
#define f(x) (x)+(x)
#define g(x) ((x)+(x))
int main() {
int b = f(4 + 6)/g(2 + 3);//为了更直观这里g的实参变成了 2+3
std::cout<<b<<std::endl;
// 运行结果:11
// b = f(4 + 6)/g(2 + 3),这里的4 + 6或2 + 3,即参数x,
// 直接替换,那么b = (4 + 6) + (4 + 6) / ((2 + 3) + (2 + 3)) = 10 + 10 / 10 = 11
return 0;
}
这个时候因为加减乘除这些运算符的优先级低于括号(话说数学里有没有优先级比括号高的运算符撒,emmm…),那么确实是可以的,但是总体上还是不建议做额外的操作,直接替换虽然显得优点墨迹优点笨,但是不容易犯错,无论在做题还是自己写代码的时候,这样慢慢的理清楚其中的逻辑也不见得不高效。
写写博客,希望能治治自己这脑残易忘的毛病!