黑马程序员技术交流社区

标题: 关于宏定义的问题 [打印本页]

作者: 程序猿-2014    时间: 2014-4-10 20:36
标题: 关于宏定义的问题
本帖最后由 程序猿-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啊    求大神解惑


作者: 一只小菜鸟    时间: 2014-4-10 20:37
重新看一遍视屏吧!!!2+3*6+4
作者: 啊康    时间: 2014-4-10 20:45
这个是宏定义时应该注意的问题,
一般在定义带参数的宏时,一定要给每个参数带上括号,同时给给整个参数都带上括号

#define sum(a, b) ((a)+(b))
否则就会出现上述问题,因为运算符的优先级不同,所以在上面的情况就会出现编译不出错
但是结果却不正确
所以定义带参数的宏时一定要记得带上所谓的两个括号。
作者: Freedam    时间: 2014-4-11 04:42
  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.
作者: 王雪冬    时间: 2014-4-11 08:26
你的代码:
  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

作者: heima-王鹏    时间: 2014-4-11 15:21
首先要明白宏定义的意思是预处理指令,也就是在程序编译之前的一种操作,即替换所有的变量,但不进行程序的执行,主要是替换一下就知道为什么了
作者: 戴文婷    时间: 2014-4-14 02:26
#include <stdio.h>
#define sum(a, b) a+b

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






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2