我不明白为什么这个程序打印这些结果

Ang*_*ela -1 c

这个程序打印出-8 -4但我想知道为什么以及为什么不是编译器显示有关使用哪个函数的错误?为什么结果不同.我对定义这样的函数知之甚少,也可以解释一下

#include <stdio.h>
#include <stdlib.h>

int foo(int x, int y);

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

int main() {
    int i = -6, j = 3;
    printf("%d ", foo(i + j, 3));
#undef foo
    printf("%d\n", foo(i + j, 3));
}

int foo(int x, int y) {
    return x/y + x;
}
Run Code Online (Sandbox Code Playgroud)

Gov*_*mar 5

如果您预处理对宏的调用foo,您会得到:

i + j / 3 + i + j
Run Code Online (Sandbox Code Playgroud)

有你的价值观,就是这样

(-6) + 3 / 3 + (-6) + 3
Run Code Online (Sandbox Code Playgroud)

评估为-8.

当您取消定义宏时foo,您将获得该函数,foo而不是return x + y / x执行该行.

随着i = -6j = 3,你得到:

(-3) / 3 + -3
Run Code Online (Sandbox Code Playgroud)

这是-4.

进一步阅读: