#include<stdio.h>
#define ABS(a,b) \
do { \
(a>0) ? b = a : (b = -a); \
return b; \
}while(0) \
int main()
{
int a = -2, b;
ABS(a,b);
printf("a=%d b=%d\n", a, b);
}
我无法理解这个的输出。请解释。感谢
答案 0 :(得分:1)
这不会产生任何输出。对于宏,定义的代码将替换宏调用,从而产生以下程序:
int main()
{
int a = -2, b;
do {
(a>0) ? b = a : (b = -a);
return b;
}while(0)
printf("a=%d b=%d\n", a, b);
}
如您所见,代码在到达return
之前会printf()
。
如果您要解决此问题,请将b
设置为a
的绝对值:
#define ABS(a,b) ((a)>0) ? ((b) = (a)) : ((b) = -(a))
int main()
{
int a = -2, b;
ABS(a, b);
printf("a=%d b=%d\n", a, b);
}
输出:
a=-2 b=2
最好始终将宏参数放在括号内,以防它们是更复杂的值,可能具有特定的操作要求顺序。
答案 1 :(得分:0)
最简单的解释是解压缩宏。如果你这样做,你得到
return b;
因此,您可以看到printf
将在到达2
之前退出程序,并将~/Library/Developer/Xcode/DerivedData
输出回命令shell。故事的寓意是尽量减少使用宏。
答案 2 :(得分:0)
我想这是学校的作业?但我会帮你理解一下。
您可能知道,main函数是应用程序的入口点。在那里,a被定义,b不是,所以b将是0或“随机”值(取决于编译器)。 ABS已被定义为一个宏,导致ABS(a,b)被do替换,同时操作。
由于a不大于0,因为条件“(a> 0)”依赖于该值,要么导致b得到a的值。或b获取a的值。
简单地说,它将b的值设置为| a | (a.k.a的抽象值总是正面的)
while(0)是无意义的,什么都不做,如果没有,则导致do不再被执行。
由于宏中有返回,程序不会输出任何内容。因为应用程序将在printf之前退出。