Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:返回错误结果的已定义行为_C_User Defined Functions - Fatal编程技术网

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:哦,宏确实有它们的用法。只是在(n
inline
)函数不起作用的地方。@Olaf-我同意它们有时起作用。但最好避免它们,尽管IMHOit扩展到
(x+1*y+1)
,这可能不是您所期望的,您需要更多的括号。请再次仔细阅读最后一句话。看看预处理器的输出,然后想想你在小学数学课上学到了什么。。。。不使用的一个很好的理由macros@EdHeal:哦,宏确实有它们的用法。只是在(n
inline
)函数不起作用的地方。@Olaf-我同意它们有时起作用。但最好是避免它们