找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1810|回复: 11
收起左侧

请教 关于C语言宏定义的问题

[复制链接]
ID:47286 发表于 2020-1-11 14:46 | 显示全部楼层 |阅读模式
比如 在keil中 我定义这样一个宏
#define a  1+2


调用时
x=a;

问题

运算过程是 x=3 还是 x=1+2

我理解应该是x=1+2 就是说每次调用a都会进行一次1+2的运算

但这两天看书说 define在编译时就运算完了 要是按书里的说法理解 每次调用a 应该直接就是3而不进行1+2运算

有点糊涂了 应该是哪个
回复

使用道具 举报

ID:685006 发表于 2020-1-11 15:11 | 显示全部楼层
编译时就已经运算完了。
回复

使用道具 举报

ID:685069 发表于 2020-1-11 17:16 | 显示全部楼层
我觉得是第二个,宏定义本身是对程序中特殊命令的预处理,经过预处理后程序就不再包括预处理命令了,最后再由编译程序时——预处理——源程序进行编译处理,得到可供执行的目标代码。所以是x直接是3,a还是1+2,但是在预处理中完成的。
回复

使用道具 举报

ID:685071 发表于 2020-1-11 17:27 | 显示全部楼层
宏定义就是把定义的宏在程序运行时直接替换  在程序编译的时候a被替换成1+2  所以就变成x=1+2
回复

使用道具 举报

ID:275826 发表于 2020-1-11 18:18 | 显示全部楼层
就是x=3
回复

使用道具 举报

ID:267932 发表于 2020-1-11 19:46 | 显示全部楼层
原样替换  ,你理解应该是对的
回复

使用道具 举报

ID:267932 发表于 2020-1-11 19:58 | 显示全部楼层
你可以自己 验证的 ,  #define a  1+4       然后  x = a/4;     打印看结果多少   就知道是先加等于5   还是原样替换了。
回复

使用道具 举报

ID:473159 发表于 2020-1-11 19:58 | 显示全部楼层
你这是偷懒!这样的疑问完全是自己可以在C编程器中去验证的事!
回复

使用道具 举报

ID:47286 发表于 2020-1-11 21:29 | 显示全部楼层
zhai1995 发表于 2020-1-11 19:58
你可以自己 验证的 ,  #define a  1+4       然后  x = a/4;     打印看结果多少   就知道是先加等于5    ...

欧了 你这个方法好 我试试
回复

使用道具 举报

ID:47286 发表于 2020-1-11 22:09 | 显示全部楼层
感谢楼上各位前辈的回复 特别感谢7楼的回复 根据你的建议我验证了一下 情况如下

第一种

#define a 4+4

uchar x;

x=a/4;

结果 x=5

说明是直接替换

第二种
#define a 4+4
uchar b=a;
uchar x=0;

x=b/4;
x=2;

说明编译时已经运算过了

我这么表达可能不太准确 就是说直接调用宏定义的东西 就是直接替换 写什么进去就直接替换成什么 但如果把宏声明给一个变量 在编译时会直接把宏的值运算出来给变量
回复

使用道具 举报

ID:685212 发表于 2020-1-12 01:23 | 显示全部楼层
我觉得应该是x=1+2
回复

使用道具 举报

ID:462827 发表于 2020-1-12 11:31 | 显示全部楼层
宏定义在预编译阶段只是查找替换
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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