鱼C论坛

 找回密码
 立即注册
查看: 2867|回复: 12

C语言宏定义问题

[复制链接]
发表于 2020-2-21 14:15:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#define F(n) 2*n
int main()
{
        printf("%d,%d",F(3+(2)),F(5));
        return 0;
}
为啥会将宏里面的拆分开来计算?也就是变成F(3)+2呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-21 14:21:17 | 显示全部楼层
宏定义只是单纯的实现替换,F(3+2)=2*3+2=7
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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))

希望对你有所帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 14:43:06 | 显示全部楼层
3+(2)是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 15:24:45 | 显示全部楼层

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 15:54:06 | 显示全部楼层
不会的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 15:54:46 | 显示全部楼层
xiaosdm 发表于 2020-2-21 15:24
我想算看会不会先计算3+2在计算宏

并不会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 15:58:38 | 显示全部楼层

宏只能简单替换,连括号都不会加,比如
#define F(n) n+5
F(5*F(5))=30
一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 21:47:06 | 显示全部楼层
xiaosdm 发表于 2020-2-21 15:24
我想算看会不会先计算3+2在计算宏

宏就是完成一个替换的功能,仅单纯的替换,不计算优化的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 22:17:25 | 显示全部楼层
本帖最后由 major_lyu 于 2020-2-21 22:34 编辑

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

  1. #define F(n) (n)*2
复制代码

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

但是如果定义:
  1. #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
好好体会一下,字符替换。哈哈

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 10:07:04 | 显示全部楼层
宏定义只是单纯的实现替换,不会实现运算。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表