C程序输出

时间:2010-04-25 08:12:23

标签: c macros c-preprocessor

#include<stdio.h>

#define a(x) (x * x) 

int main() 
{
    int i = 3, j;

    j = a(i + 1);
    printf("%d", j);

    return 0;
}

我想知道为什么程序没有提供输出16。 (我得到输出7。)


我非常理解这一点,但如果程序是这样的话:

#include<stdio.h>

#define a(x) (x * x)

int main()
{
    int i = 3, j, k;

    j = a(i++);
    k = a(++i);
    printf("%d\n%d", j, k);

    return 0;
} 

那么为什么上面的程序给出了以下输出:

9
49

7 个答案:

答案 0 :(得分:7)

因为你做了一个糟糕的宏:

a(i + 1)

扩展为

i + 1 * i + 1

相当于

i + i + 1

2 * i + 1

使用括号:

#define a(x) ((x) * (x))

然后你会把它扩展到

(i + 1) * (i + 1)

做你想做的事。

答案 1 :(得分:2)

阅读C运算符优先级,并考虑在这种情况下宏a展开的内容。

答案 2 :(得分:2)

预处理后的行

j=a(i+1);

将是:

j=(i+1*i+1);

,在对i=3进行评估时会给出j=7

j=(3+1*3+1);

要获得所需的结果,您需要将宏定义为:

#define a(x) ((x)*(x)) 

导致:

j=((i+1)*(i+1));

并在16

时提供结果i=3

答案 3 :(得分:1)

因为a(i+1)被预处理到(i+1*i+1)

3 + 3 + 1 = 7。

您可能希望在x周围使用括号。

编辑:哇,这是多余的还是什么。 :/

答案 4 :(得分:0)

答案 5 :(得分:0)

因为你的宏是错误的。显然它可以工作,但错误更微妙(不完全,但仍然),因为扩展的代码有一些问题,不遵循预期的操作顺序。

j = a(i+1)将扩展为j = i + 1 * i + 1 7

如果您要解决问题,请将您的宏重新定义为:

#define a(x) ((x)*(x))

你现在遇到这个问题很好,而不是以后。那些类型的错误,有时很难调试,但现在你将知道如何编写“专业”宏:)。

答案 6 :(得分:0)

因为a(i + 1)被预处理为(i + 1 * i + 1)。

3 + 3 + 1 = 7。

您可能希望在x周围使用括号。

编辑:哇,这是多余的还是什么。 :/

链路|标志