#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 .. 请解释..帮助
答案 0 :(得分:6)
foo(x,y)
被定义为 x/y +x
,所以 foo(i+j,3)
扩展为 i+j/3 +i+j
。由于 /
的优先级高于 +
,因此这相当于 i + (j / 3) + i + j
,not 到 (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。