黑马程序员技术交流社区
标题: 关于宏定义的问题 [打印本页]
作者: 程序猿-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
- #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;
- }
复制代码
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
你的代码:
- #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;
- }
复制代码
其中这一行:
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 |