输出结果

wit2188 2008-02-15 04:32:46
#include "stdio.h"
#define MACRO(x) x+10
#define MAX(a,b) (a>b?a:b)
main()
{
{
int x=2;
printf("%d\n",x*MACRO(2));
}
{
int i;
for(i=0;i<=100;i+=50)
{
printf("%d,%d\n",i,9.0/5*i+20);
}
}
{
int x=1,y=2;
printf("%d,%d,%d\n",MAX(x++,y),x,y);
}
}
自己得:14
0,20
50,110
100,200
2,2,2
编译得:14
0,0
50,0
100,0
2,1,2
何解?
...全文
137 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushichao1987 2008-02-17
  • 打赏
  • 举报
回复
终于知道怎么用代码模式发了,晕啊
wushichao1987 2008-02-17
  • 打赏
  • 举报
回复
终于知道怎么用代码模式发了,晕啊
wushichao1987 2008-02-17
  • 打赏
  • 举报
回复
for
wushichao1987 2008-02-17
  • 打赏
  • 举报
回复

for
qi890402 2008-02-16
  • 打赏
  • 举报
回复
首先,我认为这行printf("%d,%d\n",i,9.0/5*i+20); 中的9.0应该为9因为你定义的是int型,如果改为printf("%d,%d\n",i,9/5*i+20);那么第二行就得0,20...其次,因为你定义的为int所以9/5=1,1*50+20=70。永远不会向你认为的9*(1/5*50)+20=110这样...最后,x++在运算里的意思是先读数再自加所以这步的X还应该是1。如果printf("%d,%d,%d\n",MAX(x++,y),x,y);后再加一行printf("%d\n",x);这时就得x=2了
arong1234 2008-02-16
  • 打赏
  • 举报
回复
printf/scanf不对类型进行检查,当你传入一个%d但是后面的类型是float时,实际等价于下面的式子

printf("%d",myfloat)

等价于

printf("%d",*(int*)&myfloat);

也就是它根据其内存布局来决定到底输出啥,它会把myfloat所对应的内存的前四个字节当作整数处理,假如这个浮点数前四个字节为0,则输出为0。至于到底输出啥,你得研究浮点数格式才知道

所以如果遇到这种情况,你必须强制类型转换

printf("%d",(int)myfloat)

这样才能对
asmst 2008-02-16
  • 打赏
  • 举报
回复
犯了以偏概全的错误,printf对于部分浮点数是输出0的,但是对于另外一些浮点数不是这样的,具体输出什么,可能还是要看一下它的源代码才能知道。
我测试的时候只测试了一下110.0,没有注意其它的数值,sorry!
asmst 2008-02-16
  • 打赏
  • 举报
回复
printf("%d,%d\n",i,9.0/5*i+20);
类型不匹配,修改为:
printf("%d,%f\n",i,9.0/5*i+20);

以上是5楼的回复,不知道你看了没有?
你在原式里面使用了9.0这个浮点数,导致那个表达式结果为浮点数,但是却要以整数显示,printf可能不知所措了,就直接显示为0. 我自己写代码测试了一下,确实如此!
wit2188 2008-02-16
  • 打赏
  • 举报
回复
#include "stdio.h"
#define MACRO(x) x+10
#define MAX(a,b) (a> b?a:b)
main()
{
int i;
for(i=0;i <=100;i+=50)
{
printf("%d,%d\n",i,9.0/5*i+20);
}
}
多谢,但我仍不知执行上述代码的结果:
0,0
50,0
100,0
是怎么回事?
arong1234 2008-02-15
  • 打赏
  • 举报
回复
很多东西,研究很多的结果就是不用它
arong1234 2008-02-15
  • 打赏
  • 举报
回复
不要在宏、复杂表达式中用++和--,这是万错之源

如果是C++,尽量不用宏
drizztguai 2008-02-15
  • 打赏
  • 举报
回复
关于这个问题建议楼主看 <C和指针> 的284页. 有很详细的解释.

没有书可以下个PDF的电子版,CSDN的资源里就有下的。
大前置 2008-02-15
  • 打赏
  • 举报
回复
#include   "stdio.h" 
#define MACRO(x) x+10
#define MAX(a,b) (a> b?a:b)
main()
{
{
int x=2;
printf("%d\n",x*MACRO(2));
}
{
int i;
for(i=0;i <=100;i+=50)
{
//printf("%d,%d\n",i,9.0/5*i+20); 数据类型不匹配
printf("%d,%d\n",i,(int)(9.0/5*i)+20);
}
}
{
int x=1,y=2;
//printf("%d,%d,%d\n",MAX(x++,y),x,y); //x++ 引用X即输入了x才自加
//++x 先自加,即已经x=x+1了才 输出X
// printf("%d,%d,%d\n",MAX(++x,y),x,y); //也不行
printf("%d,%d,%d\n",++x,x,y) ; //结果 是 2 1 2
printf("%d",x); //结果是 2
// 我只能解释 是 程序执行顺序问题了
}
}
drizztguai 2008-02-15
  • 打赏
  • 举报
回复
MACRO(x) x+10

---> 将宏当方程带入 : x*x + 10 = 14 而不是本意x*(x+10) = 24
所以应该改成MACRO(x) ( (x) + 10 )
szduweibing 2008-02-15
  • 打赏
  • 举报
回复
printf("%d,%d\n",i,9.0/5*i+20);
类型不匹配,修改为:
printf("%d,%f\n",i,9.0/5*i+20);

printf("%d,%d,%d\n",MAX(x++,y),x,y);
与编译器有关,有些就是2,2,2,
但是有些是2,1,2
函数参数入栈的顺序不一样
drizztguai 2008-02-15
  • 打赏
  • 举报
回复
#define MACRO(x) ((x)+10)
#define MAX(a,b) ((a)>(b)?(a):(b))

改了也不对吧

这个错误的原因是因为 自增的副作用 而不是 ()的原因吧...
drizztguai 2008-02-15
  • 打赏
  • 举报
回复
MAX(x++,y)

---> 将宏当个方程代入: (1++) > 2 ? (1++ ) : 2

所以MAX(x++,y) = 2
x = 2 // 1++ 自增后了
y = 2

wuyi8808 2008-02-15
  • 打赏
  • 举报
回复
#define       MACRO(x)       ((x)+10) 
#define MAX(a,b) ((a)>(b)?(a):(b))
ouyh12345 2008-02-15
  • 打赏
  • 举报
回复
加括号
#define MACRO(x) (x)+10
#define MAX(a,b) ((a)> (b)?(a):(b))

70,022

社区成员

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

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