宏替换

wit2188 2008-02-14 03:17:10
#include "stdio.h"
#define PI 3.1415926
#define FUDGE(k) k+PI
#define PR(a) printf("a=%d\t",(int)(a))
#define PRINT(a) PR(a);putchar('\n');
#define PRINT2(a,b) PR(a);PRINT(b)
#define PRINT3(a,b,c) PR(a);PRINT2(b,c)
#define MAX(a,b) (a<b?b:a)
main()
{
int x=1,y=2;
PRINT3(MAX(x++,y),x,y);
PRINT3(MAX(x++,y),x,y);

}
自己算得: a=2 a=2 a=2
a=2 a=3 a=2
编译器执行:a=2 a=2 a=2
a=3 a=4 a=2
怎么回事?
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
visame 2008-02-14
  • 打赏
  • 举报
回复
以前问过一次。关注!
drizztguai 2008-02-14
  • 打赏
  • 举报
回复
象 自增 自减 getchar() 都会产生副作用. 所以宏里出现这个一般要小心。
drizztguai 2008-02-14
  • 打赏
  • 举报
回复
唉呀.

这个我会. 可惜被你们说了.

是因为宏的副作用.
ouyh12345 2008-02-14
  • 打赏
  • 举报
回复
在每个变量加括号
yecheng_110 2008-02-14
  • 打赏
  • 举报
回复
main()
{
int x=1,y=2;
printf("a=%d\t",(int)((x++ <y?y:x++)));printf("a=%d\t",(int)(x));printf("a=%d\t",(int)(y));putchar('\n');;
printf("a=%d\t",(int)((x++ <y?y:x++)));printf("a=%d\t",(int)(x));printf("a=%d\t",(int)(y));putchar('\n');;

}
没有理解什么是宏
预编译后的结果
baihacker 2008-02-14
  • 打赏
  • 举报
回复
x = 2 y = 2:
PRINT3(MAX(x++,y),x,y);
->
PRINT(MAX(x++,y)) -> PRINT(x++ < y ? x++ : y) : 计算(x++ < y)得false同时x++,返回值为x,x再自增1
PRINT(x)
PRINT(y)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧