请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 329|回复: 10

[C语言] C语言带参宏定义和函数的区别

[复制链接]

3172

主题

3269

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22691
发表于 2015-12-24 18:09:31 | 显示全部楼层 |阅读模式
带参的宏和带参函数很相似,但有本质上的不同,把同一表达式用函数处理与用宏处理的结果有可能是不同的。

【示例①】用函数计算平方值。
  • #include <stdio.h>
  • int SQ(int y){
  •   return ((y)*(y));
  • }
  • int main(){
  •     int i=1;
  •     while(i<=5){
  •         printf("%d^2 = %d\n", (i-1), SQ(i++));
  •     }
  •     return 0;
  • }


运行结果:
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25

【示例②】用宏计算平方值。
  • #include <stdio.h>
  • #define SQ(y) ((y)*(y))
  • int main(){
  •     int i=1;
  •     while(i<=5){
  •         printf("%d^2 = %d\n", i, SQ(i++));
  •     }
  •     return 0;
  • }


VC 6.0下运行结果:
1^2 = 1
3^2 = 9
5^2 = 25

C-Free(MinGW)下运行结果:
3^2 = 1
5^2 = 9
7^2 = 25
之所以出现不同的结果,与 printf() 参数列表中表达式的计算顺序和优先级有关,这里不再深究。
分析如下:在示例①中,函数调用是把实参 i 值传给形参 y 后自增 1,然后输出函数值,所以要循环5次,输出1~5的平方值。而在示例②中宏调用时只作代换,SQ(i++) 被代换为 ((i++)*(i++))。第一次循环,i 的值为1,(i++)*(i++)=1;第二次循环 i 的值为 3,(i++)*(i++)=9;第三次循环 i 的值为 5,(i++)*(i++)=25;第四次循环,i 的值为7,终止循环。

从以上分析可以看出函数调用和宏调用二者在形式上相似,在本质上是完全不同的。

宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。看下面的例子。
  • #include <stdio.h>
  • #define SSSV(s1, s2, s3, v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h;
  • int main(){
  •     int l=3, w=4, h=5, sa, sb, sc, vv;
  •     SSSV(sa, sb, sc, vv);
  •     printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n", sa, sb, sc, vv);
  •     return 0;
  • }


运行结果:
sa=12
sb=15
sc=20
vv=60
回复

使用道具 举报

2

主题

920

帖子

87

积分

注册会员

Rank: 2

积分
87
发表于 2016-2-3 12:35:49 | 显示全部楼层
谢谢您的分享!
回复 支持 反对

使用道具 举报

0

主题

957

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2016-2-4 14:56:47 | 显示全部楼层
好东西一定要看看!
回复 支持 反对

使用道具 举报

0

主题

944

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2016-2-21 11:10:40 | 显示全部楼层
有些不是太明白,研究研究再说
回复 支持 反对

使用道具 举报

8

主题

1005

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2016-12-15 17:03:56 | 显示全部楼层
我是路过的,轻轻飘过
回复 支持 反对

使用道具 举报

0

主题

590

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2017-1-29 12:16:06 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

2

主题

941

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2017-5-6 19:53:08 | 显示全部楼层
先收藏再学习,谢谢啦!
回复 支持 反对

使用道具 举报

0

主题

704

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2017-8-29 20:51:59 | 显示全部楼层
学习贵在坚持哦
回复 支持 反对

使用道具 举报

1

主题

894

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2018-1-25 17:00:20 | 显示全部楼层
顶楼主,帮你顶个贴,我挣个积分
回复 支持 反对

使用道具 举报

0

主题

633

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2018-10-17 20:25:57 | 显示全部楼层
好啊楼主,没想到啊,太好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2018-11-21 01:56 , Processed in 0.208619 second(s), 32 queries .

快速回复 返回顶部 返回列表