首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 输出结果
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wit2188
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-02-15 16: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
    何解?
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ouyh12345
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-02-15 16:42:451楼 得分:0
    加括号
    #define  MACRO(x)  (x)+10
    #define  MAX(a,b)  ((a)> (b)?(a):(b))
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 16:43:422楼 得分:0
    C/C++ code
    #define MACRO(x) ((x)+10) #define MAX(a,b) ((a)>(b)?(a):(b))
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • drizztguai
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 16:44:013楼 得分:0
    MAX(x++,y)

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

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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • drizztguai
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 16:46:164楼 得分:0
    #define      MACRO(x)      ((x)+10)
    #define      MAX(a,b)      ((a)>(b)?(a):(b))

    改了也不对吧

    这个错误的原因是因为 自增的副作用 而不是 ()的原因吧...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • szduweibing
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 16:49:115楼 得分:0
    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 16:49:246楼 得分:0
    MACRO(x)  x+10

    ---> 将宏当方程带入 : x*x + 10 = 14 而不是本意x*(x+10) = 24
    所以应该改成MACRO(x) ( (x) + 10 )
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luwenzuo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 21:19:477楼 得分:0
    C/C++ code
    #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 22:23:378楼 得分:0
    关于这个问题建议楼主看  <C和指针> 的284页. 有很详细的解释.

    没有书可以下个PDF的电子版,CSDN的资源里就有下的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 23:34:329楼 得分:0
    不要在宏、复杂表达式中用++和--,这是万错之源

    如果是C++,尽量不用宏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-15 23:35:0710楼 得分:0
    很多东西,研究很多的结果就是不用它
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wit2188
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-16 16:51:5411楼 得分:0
    #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
    是怎么回事?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asmst
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-16 18:07:3412楼 得分:0
    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. 我自己写代码测试了一下,确实如此!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asmst
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-16 18:28:2113楼 得分:0
    犯了以偏概全的错误,printf对于部分浮点数是输出0的,但是对于另外一些浮点数不是这样的,具体输出什么,可能还是要看一下它的源代码才能知道。
    我测试的时候只测试了一下110.0,没有注意其它的数值,sorry!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-16 18:46:0314楼 得分:0
    printf/scanf不对类型进行检查,当你传入一个%d但是后面的类型是float时,实际等价于下面的式子

    printf("%d",myfloat)

    等价于

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

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

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

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

    这样才能对
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qi890402
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-16 22:54:2215楼 得分:0
    首先,我认为这行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了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wushichao1987
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-17 03:11:0116楼 得分:0

    for
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wushichao1987
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-17 03:11:2917楼 得分:0
    C/C++ code
    for
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wushichao1987
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-17 03:12:2518楼 得分:0
    终于知道怎么用代码模式发了,晕啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wushichao1987
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-17 03:12:5519楼 得分:0
    终于知道怎么用代码模式发了,晕啊
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved