带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两
者的结果有可能是不同的。 main(){
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}
SQ(int y)
{
return((y)*(y));
}#define SQ(y) ((y)*(y))
main(){
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}
在上例中函数名为SQ,形参为 Y,函数体表达式为((y)*(y))。在例 9.6中宏名为SQ,形参也为 y,字符串表达式
为(y)*(y))。两例是相同的。例9.6的函数调用为SQ(i++),例9.7的宏调用为SQ(i++),实参也是相同的。从输出
结果来看,却大不相同。分析如下:在例9.6中,函数调用是把实参i值传给形参y后自增1。然后输出函数值。因
而要循环 5次。输出1~5的平方值。而在例9.7中宏调用时,只作代换。SQ(i++)被代换为((i++)*(i++))。在第一次
循环时,由于i等于 1,其计算过程为:表达式中前一个i初值为1,然后i自增1变为2,因此表达式中第2个 i初
值为2,两相乘的结果也为2,然后i值再自增 1,得3。在第二次循环时,i值已有初值为3,因此表达式中前一个 i
为3,后一个i为4, 乘积为12,然后i再自增1变为5。进入第三次循环,由于i 值已为5,所以这将是最后一次
循环。计算表达式的值为 5*6等于30。i值再自增 1变为 6,不再满足循环条件,停止循环。从以上分析可以看出函
数调用和宏调用二者在形式上相似, 在本质上是完全不同的。
2015年全国职称计算机考试教材(2007模 .. 定价:¥225 优惠价:¥213 更多书籍 | |
全国职称计算机考试速成过关系列套装:W .. 定价:¥133 优惠价:¥133.0 更多书籍 |