为什么返回值不是我在这个带有宏的C程序中期望的值?

为什么返回值不是我在这个带有宏的C程序中期望的值?,c,macros,printf,C,Macros,Printf,当我运行下面的代码时,返回值是11,但我希望它返回25。有人能解释一下吗 #include<stdio.h> #define SQR(a) a*a int main() { int i=3; printf("%d",SQR(i+2)); return 1; } #包括 #定义SQR(a)a*a int main() { int i=3; printf(“%d”,SQR(i+2)); 返回1; } 需要更多的括号。这: #define SQR(a) a*a

当我运行下面的代码时,返回值是11,但我希望它返回25。有人能解释一下吗

#include<stdio.h>
#define SQR(a) a*a

int main()
{
    int i=3;
    printf("%d",SQR(i+2));
    return 1;
}
#包括
#定义SQR(a)a*a
int main()
{
int i=3;
printf(“%d”,SQR(i+2));
返回1;
}

需要更多的括号。这:

#define SQR(a) a*a
扩展到:

i+2*i+2
即:

3+2*3+2
这是11,因为
*
优先于
+

您需要这样定义宏:

#define SQR(a) ((a)*(a))

以确保此类事件不会发生。

需要更多的括号。这:

#define SQR(a) a*a
扩展到:

i+2*i+2
即:

3+2*3+2
这是11,因为
*
优先于
+

您需要这样定义宏:

#define SQR(a) ((a)*(a))

以确保这种情况不会发生。

宏与常规函数不同

在重新处理过程中,所有宏都被它们定义的内容完全替换。在您的情况下,行:

 printf("%d",SQR(i+2));
 printf("%d", i+2*i+2);
替换为以下行:

 printf("%d",SQR(i+2));
 printf("%d", i+2*i+2);
所以,你会看到意想不到的结果

正确的方法是:

#define SQR(a) ((a)*(a))
预处理器结果将是:

printf("%d", ((i+2)*(i+2)));

试着从这个错误中吸取教训。这类问题很难调试。

宏与常规函数不同

在重新处理过程中,所有宏都被它们定义的内容完全替换。在您的情况下,行:

 printf("%d",SQR(i+2));
 printf("%d", i+2*i+2);
替换为以下行:

 printf("%d",SQR(i+2));
 printf("%d", i+2*i+2);
所以,你会看到意想不到的结果

正确的方法是:

#define SQR(a) ((a)*(a))
预处理器结果将是:

printf("%d", ((i+2)*(i+2)));

试着从这个错误中吸取教训。此类问题很难调试。

欢迎使用StackOverflow。写问题时请不要使用缩写,并在适当的时候用编程语言的名称标记问题。宏不是函数。Pascal Couq谢谢。你能回答我的另一个问题吗欢迎来到StackOverflow。写问题时请不要使用缩写,并在适当的时候用编程语言的名称标记问题。宏不是函数。Pascal Couq谢谢。你能回答我的另一个问题吗您对
SQR
的定义仍然有缺陷,因为如果您尝试执行类似
SQR(5)&0xff
的操作,它将扩展到
(5)*(5)&0x1c
,这相当于
5*(5&0x1c)
,这与预期结果
(5*5)&0x1c
不同
SQR
应该这样定义:
#define SQR(a)((a)*(a))
,或者事实上根本没有定义-对其参数进行多次计算的预处理器宏是导致大量错误的原因。@MilesRout,谢谢,我会更正它。您对
SQR
的定义仍然有错误,因为如果您尝试执行类似于
SQR(5)&0xff
,它将扩展为
(5)*(5)&0x1c
,这相当于
5*(5&0x1c)
,这与预期结果的
(5*5)&0x1c
,它将中断
SQR
应该这样定义:
#define SQR(a)((a)*(a))
,或者事实上根本没有定义-多次评估其参数的预处理器宏是导致大量错误的原因。@MilesRout谢谢,我会纠正它。