| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 699 人关注过本帖
标题:关于函数调用
只看楼主 加入收藏
燃高
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:140
注 册:2011-12-13
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:16 
关于函数调用
#include<stdio.h>
#define f(x) x*x;
main()
{
    int a=6,b=2,c;
    int t,k;
    int i;
    t=f(a);
    k=f(b);
    c=t/k;
     i=(f(a))/(f(b)); // 为什么这里有问题呢!!!!
    printf("%d\n",c);
    printf("%d\n",i);
}
搜索更多相关主题的帖子: 函数 include 
2012-03-16 12:00
chan_
Rank: 3Rank: 3
来 自:武汉
等 级:论坛游侠
帖 子:84
专家分:122
注 册:2012-2-29
收藏
得分:0 
结果不对?
2012-03-16 12:06
chan_
Rank: 3Rank: 3
来 自:武汉
等 级:论坛游侠
帖 子:84
专家分:122
注 册:2012-2-29
收藏
得分:1 
i=(f(a)/f(b));
展开之后是  i=(a*a/b*b)
2012-03-16 12:09
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:1 
#define f(x) x*x;

我总算知道为什么要小心用宏

你这里多了一个分号。
你正好是这样调用的
 i=(f(a))/(f(b)); // 为什么这里有问题呢!!!!
张开:i = (a*a;)/(b*b;)
这样就提示) 多了一个;号了。
但你如果把上面改成i = f(a)-1;
你发现你的i= 36 无论你减多少。
你就发现好神奇。
通过你我发现这个程序可怕性了。要是一个大的项目、你那样定义宏。
要排除BUG 是多么可怕啊。
我们在宏后面加一个;号 也可能啊 我们都习惯这样写程序了。 可能偶尔就这样写了
可怕中啊。。。。。

用心做一件事情就这么简单
2012-03-16 12:39
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
#define f(x) ((x)*(x))

总有那身价贱的人给作业贴回复完整的代码
2012-03-16 12:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:1 
这个宏的问题太多了。
分号只是语法级的错误,依然还有逻辑隐患,试试f(a + b)

所以正确的定义方式为

#define f(x) ((x)*(x))

每个括号都不要省掉

重剑无锋,大巧不工
2012-03-16 12:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
嗯?呵呵,又重复了,看来我的打字不够快

重剑无锋,大巧不工
2012-03-16 12:54
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:1 
以下是引用beyondyf在2012-3-16 12:53:15的发言:

这个宏的问题太多了。
分号只是语法级的错误,依然还有逻辑隐患,试试f(a + b)

所以正确的定义方式为

#define f(x) ((x)*(x))

每个括号都不要省掉
分号不是语言错误吧。
我要把一个东西 替换成东西;  这样也没有错。
宏值简单替换而已。
编译器也不会认为是错的

用心做一件事情就这么简单
2012-03-16 13:04
wsws23
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:105
专家分:107
注 册:2012-3-13
收藏
得分:1 
回复 6楼 beyondyf
对于f(a+b)的宏定义,他不会执行a+bd的结果,他会这样执行a+b*a+b,和你的预期是不同的。
2012-03-16 13:12
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
加分号可以,但实际工作中很少见到宏里带分号的,用的人稍不留神就错了,可能还不会有编译错,想想这种情况,出了问题怎么定位。

总有那身价贱的人给作业贴回复完整的代码
2012-03-16 13:13
快速回复:关于函数调用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036366 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved