C语言基础:C语言宏定义(2) - 带参数的宏定义
上一节课, 我们讲解了不带参数的宏定义, 这节课我们就来讲讲带参数的宏定义又是怎么定义, 使用和注意事项~~
下面我们来看一个例子:
#include <stdio.h> #define kSum(a, b) a+b int main() { int a = 10; int b = 20; int c = kSum(a, b); printf("c = %d\n", c); return 0; }
输出结果:
这样子我们就可以实现一个简单的加法运算啦~
但是这样子存在一个问题, 下面我继续看例子:
#include <stdio.h> #define kSum(a, b) a+b int main() { int a = 10; int b = 20; int c = kSum(a, b) * kSum(a, b); printf("c = %d\n", c); return 0; }
输出的结果:
按照我们的常理来说, 这个结果显然不是我们要的结果, 那为什么会输出这个结果呢?? 我们来分析一下, 看下面的例子:
//#define kSum(a, b) a+b //其实这种写法, 只是简单的替换, 看下面: //kSum 10 + 20 * 10 + 20; int c = kSum(a, b) * kSum(a, b);
所以输出的结果是: 230
那样子我们又怎么解决问题呢? 下面继续看例子:
#include <stdio.h> #define kSum(a, b) (a+b) int main() { int a = 10; int b = 20; int c = kSum(a, b) * kSum(a, b); printf("c = %d\n", c); return 0; }
输出的结果:
这样子就可以解决简单的问题, 但问题又来了, 其实这样子写宏定义还是有问题的, 我们继续来看:
#include <stdio.h> #define kPingfang(a) (a*a) int main() { int c = kPingfang(2+2)/kPingfang(2); printf("c = %d\n", c); return 0; }
输出的结果:
有人肯定有疑问的说, 结果不对啊, 为什么会是2呢??
我们继续分析:
//#define kPingfang(a) (a*a) //kPingfang (2+2 * 2+2) / (2 * 2) int c = kPingfang(2+2)/kPingfang(2);
刚刚我们说了, 那个宏定义只是简单的替换, 所以显示的运算和上面的例子一样, 所以我们得出来的结果是: 8 / 4 = 2;
那我们要怎么解决呢?? 继续看下面的例子:
#include <stdio.h> #define kPingfang(a) ((a) * (a)) int main() { //#define kPingfang(a) (a*a) //kPingfang ((2+2) * (2+2)) / (2 * 2) int c = kPingfang(2+2)/kPingfang(2); printf("c = %d\n", c); return 0; }
输出的结果:
只有这样子书写, 才是完全正确的, 一个有经验的程序员也是这么写的, 因为这样子写才够严谨.
说到这里, 或许有人会问, 函数不也是可以这样子调用吗, 那么宏定义和函数, 哪个效率比较高呢?
非要比较的话, 是宏定义的效率最高, 因为函数还需要进去里面调用, 而宏定义在编译之前就已经预处理完毕了, 所以宏定义的效率更高.
好了, 这次我们讲到这里, 下次我们继续~~~