社区
C++ 语言
帖子详情
#define max(a,b) ((a) > (b) ? (a) : (b))的问题
jjjjyyyyy
2005-10-24 12:59:14
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
别人的文章中看到的,增加几次是怎么发生的,应怎么理解啊?
请老师指导,不胜感谢!
...全文
2513
13
打赏
收藏
#define max(a,b) ((a) > (b) ? (a) : (b))的问题
int a = 5, b = 0; max(++a, b);// a 的值增加了2次 max(++a, b+10); // a 的值只增加了1次 别人的文章中看到的,增加几次是怎么发生的,应怎么理解啊? 请老师指导,不胜感谢!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
maojun1986
2005-12-20
打赏
举报
回复
学习...
sinall
2005-12-19
打赏
举报
回复
总之,分析的时候,你把你的语句用宏替换掉;转成普通语句就OK了。
Tycool
2005-12-19
打赏
举报
回复
注意这种macro的使用。
cunsh
2005-12-19
打赏
举报
回复
inline
shu_yoyo
2005-12-18
打赏
举报
回复
是这样的,,,好像是effectiv c++上的问题。
zhousqy
2005-12-18
打赏
举报
回复
都说了,LZ只要把参数代进去看看就知道了。
Mr_Yang
2005-12-18
打赏
举报
回复
都说完了,只能学习了。
zhujiujun
2005-12-18
打赏
举报
回复
up
doway
2005-10-24
打赏
举报
回复
根宏一点关系都没有,正确的写法:
a++;
max(a, b);
jixingzhong
2005-10-24
打赏
举报
回复
恩, 楼上说的正确!
用 宏定义 带来的问题之一就是这个问题了 ...
如果用的是模板, 就不会出现这种情况了 !! 建议使用模板 !!
寻开心
2005-10-24
打赏
举报
回复
#define max(a,b) ((a) > (b) ? (a) : (b))
这是宏定义, 实际编译器在遇到这个max的定义的时候,自动用展开后编译的
展开的时候,用a和b的表达式直接替换内容的
以 max(++a, b) 为例子,实际编译器处理的就是
(++a>b)? ++a:b;
所以++a在实际使用的时候是被多次调用的
把宏定义,改成模板方式可以解决这个问题,保证只调用一次++操作
snowbirdfly
2005-10-24
打赏
举报
回复
int a = 5, b = 0;
max(++a, b);
代入 #define max(a,b) ((a) > (b) ? (a) : (b))
就是((++a) > (b)) ? (++a):(b)
++a = 6 > 0,所以执行++a,所以a加了2次
max(++a, b+10)
代入#define max(a,b) ((a) > (b) ? (a) : (b))
就是((++a) > (b+10)) ? (++a):(b+10)
由于++a = 6 > 10?所以执行b + 10,a 的值只增加了1次
qfeng_zhao
2005-10-24
打赏
举报
回复
max(++a, b);// a 的值增加了2次
宏展开就是:
((++a) > (b) ? (++a) : (b))
因为++a>b为true, 所以其值为前一项即:++a,所以a共加了2次
max(++a, b+10); // a 的值只增加了1次
(++a) > (b+10)为false,所以其值取后一项,即b,忽略了前一项++a所以a共计算一次
define
(
define
d是什么意思)
c语言 定义
define
使用方法
define
是预编译指令,就是编译的时候直接编译到代码里的,不是运行时的指令,所以是全局的,不能重复。 你把所有宏去掉,直接变成代码就行。
define
是c语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。 预处理命令以“#”号开头,如包含命令#includ...
【C/C++】#
define
SQUARE(a)((a)*(a))的
问题
【C/C++】#
define
SQUARE(a)((a)*(a))的
问题
编译环境:Visual Studio 2013 #include<stdio.h> #
define
SQUARE(a) ((a)*(a)) int main() { int a = 7; int b; b
#
define
MAX
(a, b) ((a) > (b) ? (a) : (b))深入理解
#
define
MAX
(a, b) ((a) > (b) ? (a) : (b))深入理解
#
define
max
(a,b) 的bug频出?宏为什么不是函数
宏是预处理器对字符的变换工具,不作用于程序对象。其核心风险在于参数可能被多次求值,尤其当参数含副作用(如i++、*p++)时,会导致意外结果。即使括号齐全,也无法避免重复求值
问题
。例如
max
(biggest, x[i++])会使i++执行两次,破坏逻辑。此外,宏展开可能导致代码膨胀,影响性能与可读性。因此,应避免在宏中使用带副作用的参数,必要时改用函数以确保参数仅求值一次。
C/C++报错 error: expected unqualified-id before ‘(’ token #
define
max
(a,b) ((a) >=
expected unqualified-id before ‘(’ token
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章