C 预处理器 #define SQR(x) ( x * x )
C-preprocessor #define SQR(x) ( x * x )
我觉得我快疯了。我正在学习 C 预处理器,但我无法解决这个问题,我故意在没有括号的情况下定义了 SQR(x) (X*X)
#include <stdio.h>
#define SQR(x) (x * x)
int main()
{
int counter; /* counter for loop */
for(counter = 0; counter < 5; ++counter)
{
printf("x %d, x squared %d\n",counter+1, SQR(counter+1))
}
return (0);
}
一瞬间循环计数器 = 3。那么它应该是 3 + 1 * 3 + 1 等于 7,但输出显示为 5。
这是上面代码的输出:
x 1, x squared 1
x 2, x squared 3
x 3, x squared 5
x 4, x squared 7
x 5, x squared 9
Process returned 0 (0x0) execution time : 0.020 s
Press any key to continue.
我显然遗漏了一些东西,但我想不通。
当 counter=3 时,它打印为 4 因为你打印 counter+1
。使用:
printf("x %d, x squared %d\n",counter, SQR(counter+1));
查看计数器的实际值。
除了 Ignaus 的回答中指出的最明显的错误之外,您还有第二个更隐蔽、更危险的错误。执行预处理器将在 SQR
:
上执行的替换
SQR(counter+1)
变为:
counter+1 * counter+1
会像这样写一样执行:
counter + (1 * counter) + 1
这显然是不正确的,不是您想要的。对于宏,您应该始终 将参数括在括号中。所以你的宏应该是这样的:
#define SQR(x) ((x) * (x))
现在再做一次替换,你会得到:
((counter+1) * (counter+1))
这是正确的。养成习惯始终在括号中包含宏参数以避免此类错误。
我觉得我快疯了。我正在学习 C 预处理器,但我无法解决这个问题,我故意在没有括号的情况下定义了 SQR(x) (X*X)
#include <stdio.h>
#define SQR(x) (x * x)
int main()
{
int counter; /* counter for loop */
for(counter = 0; counter < 5; ++counter)
{
printf("x %d, x squared %d\n",counter+1, SQR(counter+1))
}
return (0);
}
一瞬间循环计数器 = 3。那么它应该是 3 + 1 * 3 + 1 等于 7,但输出显示为 5。 这是上面代码的输出:
x 1, x squared 1
x 2, x squared 3
x 3, x squared 5
x 4, x squared 7
x 5, x squared 9
Process returned 0 (0x0) execution time : 0.020 s
Press any key to continue.
我显然遗漏了一些东西,但我想不通。
当 counter=3 时,它打印为 4 因为你打印 counter+1
。使用:
printf("x %d, x squared %d\n",counter, SQR(counter+1));
查看计数器的实际值。
除了 Ignaus 的回答中指出的最明显的错误之外,您还有第二个更隐蔽、更危险的错误。执行预处理器将在 SQR
:
SQR(counter+1)
变为:
counter+1 * counter+1
会像这样写一样执行:
counter + (1 * counter) + 1
这显然是不正确的,不是您想要的。对于宏,您应该始终 将参数括在括号中。所以你的宏应该是这样的:
#define SQR(x) ((x) * (x))
现在再做一次替换,你会得到:
((counter+1) * (counter+1))
这是正确的。养成习惯始终在括号中包含宏参数以避免此类错误。