为什么它返回-8而不是-4..?
#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 .. 请解释..帮助
回答
foo(x,y)被定义为x/y +x,所以foo(i+j,3)扩展为i+j/3 +i+j。由于/优先级高于+,这等同于i + (j / 3) + i + j,不给(i + j) / 3 + i + j你大概预期。
在这种情况下,最好的解决方法是不使用宏,而是只编写一个普通函数:
int foo(int x, int y) {
return x / y + x;
}
如果出于某种原因,这不是一个选项,那么您需要添加一些括号:
#define foo(x,y) ((x) / (y) + (x))
. . . 但即使这样,如果x有副作用,也会产生奇怪的结果,因为它x被扩展了两次,所以这些副作用会发生两次。(并且在某些情况下会导致未定义的行为。)