xiaosdm 发表于 2020-2-21 14:15:37

C语言宏定义问题

#include<stdio.h>
#define F(n) 2*n
int main()
{
        printf("%d,%d",F(3+(2)),F(5));
        return 0;
}
为啥会将宏里面的拆分开来计算?也就是变成F(3)+2呢?

最后的魁拔 发表于 2020-2-21 14:21:17

宏定义只是单纯的实现替换,F(3+2)=2*3+2=7

小笨笨难得糊涂 发表于 2020-2-21 14:22:24

宏定义只是简单的替代,不做运算。
#define F(n)   2*n   
F(3+(2))    n=3+(2)    那么2*n=2*3+(2)
F(5)          n=5         那么2*n=2*5
如果想先计算n的值,可以这么宏定义
#define F(n)   2*(n )   
F(3+(2))      2*(n)=2*(3+(2))

希望对你有所帮助

小甲鱼水里游 发表于 2020-2-21 14:43:06

3+(2)是什么意思

xiaosdm 发表于 2020-2-21 15:24:45

小甲鱼水里游 发表于 2020-2-21 14:43
3+(2)是什么意思

我想算看会不会先计算3+2在计算宏

小甲鱼水里游 发表于 2020-2-21 15:54:06

不会的

小甲鱼水里游 发表于 2020-2-21 15:54:46

xiaosdm 发表于 2020-2-21 15:24
我想算看会不会先计算3+2在计算宏

并不会

小甲鱼水里游 发表于 2020-2-21 15:58:38

小甲鱼水里游 发表于 2020-2-21 14:43
3+(2)是什么意思

宏只能简单替换,连括号都不会加,比如
#define F(n) n+5
F(5*F(5))=30
一样

4goodworld 发表于 2020-2-21 21:40:27

小甲鱼水里游 发表于 2020-2-21 15:58
宏只能简单替换,连括号都不会加,比如
#define F(n) n+5
F(5*F(5))=30


不应该是:F(5*F(5))=>F(5*5+5)=>(5*5+5)+5=35?

4goodworld 发表于 2020-2-21 21:47:06

xiaosdm 发表于 2020-2-21 15:24
我想算看会不会先计算3+2在计算宏

宏就是完成一个替换的功能,仅单纯的替换,不计算优化的

小甲鱼水里游 发表于 2020-2-21 22:07:20

4goodworld 发表于 2020-2-21 21:40
不应该是:F(5*F(5))=>F(5*5+5)=>(5*5+5)+5=35?

哦,忘了还有一个F{:5_108:}

major_lyu 发表于 2020-2-21 22:17:25

本帖最后由 major_lyu 于 2020-2-21 22:34 编辑

宏展开就是单纯的字符替换。
你如果想要F(3+2)的值与F(5)的值相同,可以像下面这样定义宏

#define F(n) (n)*2

这样F(3+2)=(3+2)*2 =10
F(5) = (5)*2 = 10
宏定义的时候给参数加上括号,就是强制宏替换后的表达式中替换的字符优先运算。

但是如果定义:#define F(n) n*2
则:F(3+2) =3+2*2=7,
F((3+2)) =(3+2)*2=10)
F(((3+2))) =((3+2))*2
好好体会一下,字符替换。哈哈

sharpener 发表于 2020-2-22 10:07:04

宏定义只是单纯的实现替换,不会实现运算。{:5_103:}
页: [1]
查看完整版本: C语言宏定义问题