#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
答案 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周围使用括号。
编辑:哇,这是多余的还是什么。 :/
链路|标志