函数
#include<stdio.h>
int square(int x);
int square(int x){
return x * x;
}
/**
* 求x的平方
*/
int main(){
int i = 1;
while(i <= 100){
// i=1,1<=100,square(1)=1*1=1,i++=2,2-1=1,即1的平方=1
// i=2,i<=100,square(2)=2*2=4,i++=3,3-1=2,即2的平方=4
printf("%d的平方是%d\n",i-1,square(i++));
}
}
上面的代码很容易就能理解,下面尝试用宏定义的方式来实现功能。。。
宏定义
#include<stdio.h>
#define SQUARE(x) ((x) * (x))
int main(void){
int i = 1;
while(i <= 100){
// SQUARE(i++)--->((i++)*(i++))
// 先取i再++,再取i再++,之后对取出的i求平方
// i=1,1<=100,i++,取i=1,后++=2,再取i=2,后++=3,i*i=1*2=2,i=3,3-1=2,即2²=2
// i=3,3<=100,i++,取i=3,后++=4,再取i=4,后++=5,i*i=3*4=12,i=5,5-1=4,即4²=12
// i=5,5<=100,i++,取i=5,后++=6,再取i=6,后++=7,i*i=5*6=30,i=7,7-1=6,即6²=30
printf("%d的平方是:%d\n",i-1,SQUARE(i++));
}
return 0;
}
通过结果不难发现,宏定义求平方出错了。。。下面对代码进行拆分:
SQUARE(i++)通过拆分,变成:(i++) * (i++),
接着以下面步骤进行计算:
设i = 1,(1++) * (1++)
a.i++; // 取i = 1,后自增,i = 2
b.i++; // 取i = 2,后自增,i = 3,
c.1 * 2 = 2
d.i = 3,3 - 1 = 2,所以2[b中取出的2]的平方=2[c中求出的2]
备注:
在一定程度上,使用带参数的宏来代替函数实现一些简单的功能,程序的执行效率或许会高一些,因为宏定义是直接在预编译阶段替换到代码中,并不需要像函数一样,一次调用申请一次栈空间。
这并不意味着可以没有限制地使用宏定义,宏定义在使用时藏有许多的陷阱,如果一不小心就会写出带有bug的程序。