初学C问题,
有宏定义“#define B(x,y) x*y”,则语句“a=B(3>1,2>1);”进行宏替换后的结果时a=(3>1)*(2>1)
那为什么:
#define B(x,y) x*y
main()
{
int a;
a=B(3>1,2>1);
printf("%d\n",a);
}调试出来等于0?
printf("%d\n",(3>1)*(2>1));应该等于1的啊 ??
问题点数:10、回复次数:12Top
1 楼longlong2001(速龙)回复于 2002-02-01 14:43:10 得分 0
我好急,大家帮帮我好吗Top
2 楼liaogd(liaogd)回复于 2002-02-01 14:44:05 得分 2
其实是
a=3>1*2>1
要不你就#define B(x,y) (x)*(y)Top
3 楼interestc(随心所欲)回复于 2002-02-01 14:48:18 得分 2
楼上的完全正确,宏替换时要特别注意带括号和不带括号的不同结果,这一点在有的入门书上说的很详细!Top
4 楼jyc_nj(老蔣)回复于 2002-02-01 14:48:59 得分 4
运算符*的优先级高过>,所以宏展开后是 3>1*2>1,先是1*2等于2,再3>2为真,即为1,然后1>1的结果自然是假,即0.Top
5 楼longlong2001(速龙)回复于 2002-02-01 14:54:20 得分 0
我知道了,谢谢各位~Top
6 楼longlong2001(速龙)回复于 2002-02-01 14:56:10 得分 0
这里热心人好多啊,速度夜很快,谢谢了,鞠躬~~~~~~Top
7 楼crm2000(浏览器)回复于 2002-02-01 14:58:24 得分 0
Thinking in C++ 中专门说了宏定义的几个常见错误,应该尽量避免使用宏定义。Top
8 楼crm2000(浏览器)回复于 2002-02-01 14:59:44 得分 0
thinking in C++中专门讲述了宏定义的几个问题,由于宏定义往往出现不可预见的错误,所以最好不要用它Top
9 楼chylc(黑黑)回复于 2002-02-01 15:06:50 得分 0
#define B((x),(y)) (x)*(y)
这才是你的目的吧Top
10 楼chylc(黑黑)回复于 2002-02-01 15:09:44 得分 0
glxSearoc(逍遥) 已经说过了,没看到Top
11 楼kingprg(風云再起)回复于 2002-02-08 12:54:03 得分 0
#define B(x,y) x*y
a=B(3>1,2>1);/*这里是调用宏,但是宏调用并有像函数调用,它只是起一个置换的作用。因此,在宏执行的过程中,B(3>1,2>1)等于x*y,即3>1*2>1.显然,由于算术运算符的级别比条件运算符的级别要高,结果为1(因3>1的逻辑值为1)>1(因2>1的逻辑值也为1),所以结果为0了。要想得到想要的结果,只要在x与y的两边加上括号.即:#define B(x,y) (x)*(y)。
Top




