各位大神求助啊。。。。。。

此账号已停用 2014-10-26 07:22:41
有没有大神可以解释为什么第一段代码的结果为 9.5,而第二段代码的结果为0

第一段代码

#include <stdio.h>

#define PT 5.5
#define S(x) PT*x*x

int main()
{
int x=1, y=2;
printf("%4.1f\n", S(x+y));
return 0;
}

运行结果:


第二段代码:

#include <stdio.h>

#define PT 5.5
#define S(x) PT*x*x

int main()
{
int x=1, y=2;
printf("%d\n", S(x+y));
return 0;
}


...全文
680 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2014-10-27
  • 打赏
  • 举报
回复
宏,只会作简单替换不会安全检查等这些工作。
赵4老师 2014-10-27
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
百曉生 2014-10-26
  • 打赏
  • 举报
回复
两位都说的正确,这是宏的问题啊 http://baike.baidu.com/view/2076445.htm 带参数 除了一般的字符串替换,还要做参数代换 格式: #define宏名(参数表) 字符串 例如:#define S(a,b) a*b area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2; 类似于函数调用,有一个哑实结合的过程: (1)实参如果是表达式容易出问题 #define S(r) r*r area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b; 正确的宏定义是#define S(r) ((r)*(r)) (2)宏名和参数的括号间不能有空格 (3)宏替换只作替换,不做计算,不做表达式求解 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存 (5)宏的哑实结合不存在类型,也没有类型转换。 (6)宏展开使源程序变长,函数调用不会 (7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)[2]
侑子的小伙伴 2014-10-26
  • 打赏
  • 举报
回复
第一短代码 宏替换后是 5.5*1+2*1+2=9.5 第二段代码 相当于 printf("%d",9.5) 在C标准里边 printf()中格式不匹配 结果是未定义的
a666000abc 2014-10-26
  • 打赏
  • 举报
回复
第一段是宏定义问题 S(x+y)替换后是PT*x+y*x+y=5.5*1+2*1+2=9.5 第二段是数据类型的问题,%d是输出整型,而S(x+y)的结果不是整型

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧