考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
全国  |             |          |          |          |          |         
  当前位置:计算机等级 > 二级考试 > C语言程序设计 > C语言辅导 > 文章内容
  

全国计算机等级考试二级C语言入门教程(125)

中华IT学院   【 】  [ 2016年10月29日 ]

带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两
者的结果有可能是不同的。 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,不再满足循环条件,停止循环。从以上分析可以看出函
数调用和宏调用二者在形式上相似, 在本质上是完全不同的。

分享到:
本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2006-2017 中华考试网(Examw.com) All Rights Reserved  营业执照