为什么它返回 -8 而不是 -4 ..?

时间:2021-07-31 05:37:06

标签: c

#include <stdio.h>  
#define foo(x,y) x/y +x     
int main()
    {
        int i=-6,j=3;
        printf("%d",foo(i+j,3));
    }

问题; 这段代码给出了答案 -8

是不是在数学上返回-4 .. 请解释..帮助

2 个答案:

答案 0 :(得分:6)

foo(x,y) 被定义为 x/y +x,所以 foo(i+j,3) 扩展为 i+j/3 +i+j。由于 / 的优先级高于 +,因此这相当于 i + (j / 3) + i + jnot(i + j) / 3 + i + j,正如您可能想要的那样。

在这种情况下最好的解决方法是不使用宏,而是只编写一个普通函数:

int foo(int x, int y) {
    return x / y + x;
}

如果出于某种原因,这不是一个选项,那么您需要添加一些括号:

#define foo(x,y) ((x) / (y) + (x))

。 . .但是如果 x 有副作用,即使这样也会产生奇怪的结果,因为 x 被扩展了两次,所以这些副作用会发生两次。 (并且在某些情况下会导致未定义的行为。)

答案 1 :(得分:0)

它是 C 中宏工作方式的 -8。在编译时,代码中的所有宏都被逐字替换为宏定义。

因此,在您的示例中,所有出现的 foo(x+y) 都替换为 x/y +x,当应用于 printf 时,它来自

printf("%d",foo(i+j,3));

printf("%d",i+j/3 + i+j);

其中,当替换为 i 和 j 的值时,给出以下内容

printf("%d",-6+3/3 + -6+3);

因此,打印了 -8。