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))

这是正确的。养成习惯始终在括号中包含宏参数以避免此类错误。