为什么返回值不是我在这个带有宏的C程序中期望的值?
当我运行下面的代码时,返回值是11,但我希望它返回25。有人能解释一下吗为什么返回值不是我在这个带有宏的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
#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谢谢,我会纠正它。