这个计划的输出会是什么以及如何?

时间:2018-03-12 10:11:16

标签: c macros

#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);
}

我无法理解这个的输出。请解释。感谢

3 个答案:

答案 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之前退出。