C:返回错误结果的已定义行为
所以我明天要考试,我在我的问题上遇到了这个问题C:返回错误结果的已定义行为,c,user-defined-functions,C,User Defined Functions,所以我明天要考试,我在我的问题上遇到了这个问题 #define mul(x,y) (x * y) #include <stdio.h> #include <string.h> int main() { int x = 3; int y = 4; int z = 0; z = mul(x+1, y+1); printf("4 * 5 = %d \n", z); return 0; } 定义mul(x,y)(x*y) #包括
#define mul(x,y) (x * y)
#include <stdio.h>
#include <string.h>
int main()
{
int x = 3;
int y = 4;
int z = 0;
z = mul(x+1, y+1);
printf("4 * 5 = %d \n", z);
return 0;
}
定义mul(x,y)(x*y)
#包括
#包括
int main()
{
int x=3;
int y=4;
int z=0;
z=mul(x+1,y+1);
printf(“4*5=%d\n”,z);
返回0;
}
我的问题是,为什么输出的是8而不是20。
因为当我将z=mul(x+1,y+1)
替换为z=mul((x+1),(y+1))
时,我得到了20的正确答案宏#定义mul(x,y)(x*y)
实际上告诉预编译器,如果它找到字符串mul(任意模式x,任意模式y),它应该将其替换为(任意模式x*任意模式y)
那么你的例子中有什么
int x = 3;
int y = 4;
int z = 0;
z = mul(x+1, y+1);
更换mul
后,您将获得
int x = 3;
int y = 4;
int z = 0;
z = x+1*y+1;
==>z=3+1*4+1=8
最佳做法是用括号括住每个宏参数。在您的示例中(为了达到预期结果),应该是:
#define mul(x,y) ((x) * (y))
宏#define mul(x,y)(x*y)
实际上告诉预编译器,如果它找到字符串mul(任意模式x,任意模式y),它应该将其替换为(任意模式x*任意模式y)
那么你的例子中有什么
int x = 3;
int y = 4;
int z = 0;
z = mul(x+1, y+1);
更换mul
后,您将获得
int x = 3;
int y = 4;
int z = 0;
z = x+1*y+1;
==>z=3+1*4+1=8
最佳做法是用括号括住每个宏参数。在您的示例中(为了达到预期结果),应该是:
#define mul(x,y) ((x) * (y))
它扩展到
(x+1*y+1)
,这可能不是您所期望的,您需要更多的括号。请再次仔细阅读最后一句话。看看预处理器的输出,然后想想你在小学数学课上学到了什么。。。。不使用的一个很好的理由macros@EdHeal:哦,宏确实有它们的用法。只是在(ninline
)函数不起作用的地方。@Olaf-我同意它们有时起作用。但最好避免它们,尽管IMHOit扩展到(x+1*y+1)
,这可能不是您所期望的,您需要更多的括号。请再次仔细阅读最后一句话。看看预处理器的输出,然后想想你在小学数学课上学到了什么。。。。不使用的一个很好的理由macros@EdHeal:哦,宏确实有它们的用法。只是在(ninline
)函数不起作用的地方。@Olaf-我同意它们有时起作用。但最好是避免它们