写程序的时候都会接触到宏这个概念。#define
非常常见的一种写法
#include<stdio.h>
#define MAX 1000
int main()
{
int arr[MAX];
...
return 0;
}
这里我们定义了一个数组arr它的最大长度是我们宏定义的MAX,所以我们以后再想修改这个最大值的时候只需要在宏定义出修改就可以看,在main函数使用MAX,这样对于程序的修改提供了便利。
这其实就是宏的一种简单的用法(其实这里不能完全称之为宏,宏应该是带有参数的#define定义):给数值命名一个符号。
编写好一个代码后,要对它进行执行首先要经过这几个步骤:
预处理->编译->执行。
宏定义起作用的阶段是在预处理阶段,如果你定义了宏,那么预处理器就会原分不动的将你所写的表达式替换到你是用宏的相应位置。称之为宏替换。
但是在使用宏的时候要注意几个问题:
1.#define MYADD(x) x*x
MYMUL(5)时预处理器就会进行替换,变成5*5得出你所需要的25,但是如果是:
int a=5;
MYMUL(a+1)呢?j结果是不是你想要的36呢?答案居然是11,为什么会这样呢?因为预处理器进行了如下的替换:
a+1*a+1,这样的话根据优先级先算乘法得出的答案就是11!
现在你可能想着我宏定义的时候加上括号是不是就可以了
#define MYMUL(x) (x)*(x)
好像是对的替换完后是(a+1)*(a+1),没有问题答案是正确的!
现在又有一个宏定义:
#define MYADD(x) (x)+(x)
int a=5;
10*MYADD(a)
上面的结果会不会是10*10=100呢?然而又不是,它的结果是55,因为是
10*(5)+(5)结果就是55!
所以我们是不是又应该在加上一对括号呢?
#define MYADD(x) ((x)+(x))
因此当我们定义相关的宏时,一定要考虑的周全,该加上括号的地方一定要加上,否则会发生意外!