A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序猿-2014 中级黑马   /  2014-4-10 20:36  /  1367 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程序猿-2014 于 2014-4-15 18:38 编辑

#include <stdio.h>
#define sum(a, b) a+b

int main()
{
    int c = sum(2, 3) * sum(6, 4);

    printf("%d\n", c);
    return 0;
}
这个运行结果为什么是24啊    求大神解惑

6 个回复

倒序浏览
重新看一遍视屏吧!!!2+3*6+4
回复 使用道具 举报
这个是宏定义时应该注意的问题,
一般在定义带参数的宏时,一定要给每个参数带上括号,同时给给整个参数都带上括号

#define sum(a, b) ((a)+(b))
否则就会出现上述问题,因为运算符的优先级不同,所以在上面的情况就会出现编译不出错
但是结果却不正确
所以定义带参数的宏时一定要记得带上所谓的两个括号。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  1. #include <stdio.h>
  2. #define sum(a, b) a+b


  3. int main()
  4. {
  5.     int c = sum(2, 3) * sum(6, 4);


  6.     printf("%d\n", c);
  7.     return 0;
  8. }
复制代码


sum(2,3)*sum(6,4)这个式子在宏替换之后就变成了2+3*6+4,由于式子中乘法的优先级高所以先算3*6,结果是2+18+4=24.
如果要先算2*3或是6*4应该将宏定义改为#define sum(a,b) (a+b),这样宏替换的结果就为(2+3)*(6+4)=50.

评分

参与人数 1黑马币 +1 收起 理由
程序猿-2014 + 1 很给力!

查看全部评分

回复 使用道具 举报
你的代码:
  1. #include <stdio.h>

  2. #define sum(a, b) a+b


  3. int main()

  4. {

  5.     int c = sum(2, 3) * sum(6, 4);


  6.     printf("%d\n", c);

  7.     return 0;

  8. }
复制代码

其中这一行:
int c = sum(2, 3) * sum(6, 4);
经过替换会变为:
int c = 2+ 3 * 6+ 4;
所以结果为:
24

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
首先要明白宏定义的意思是预处理指令,也就是在程序编译之前的一种操作,即替换所有的变量,但不进行程序的执行,主要是替换一下就知道为什么了
回复 使用道具 举报
#include <stdio.h>
#define sum(a, b) a+b

    int c = sum(2, 3) * sum(6, 4);
重点的挑出来看,  替换下来的话,是 2+3*6+4 按运算级优先符号,算出来的就是24了。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马