宏定义是直接替换

宏定义就是直接替换,直接替换!

  • 宏定义的直接替换,就是最直接的替换

宏定义的直接替换,就是最直接的替换

下面以两个宏定义的简单函数为例,注意f(x) 和g(x)表达式的不同,前者没有括号,后者有括号。

#include 

#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也好都是实参。
宏定义是直接替换_第1张图片
还有一点值得说明一下,直接替换就是直接替换,不要进行任何其他的操作,例如f(4 +6)/g(2 + 1),千万不要直接把4 + 6当作10,2+ 1当作3,否则就成了10 + 10 / (3 + 3),显然是不正确的。那如果f(x) 和g(x)定义如下:

#include 

#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…),那么确实是可以的,但是总体上还是不建议做额外的操作,直接替换虽然显得优点墨迹优点笨,但是不容易犯错,无论在做题还是自己写代码的时候,这样慢慢的理清楚其中的逻辑也不见得不高效。

写写博客,希望能治治自己这脑残易忘的毛病!

你可能感兴趣的:(知识总结)