2016-06-21 64 views
0
#define N 4 
#define EXPON(x) x * x * x 
#define HALF(x) x * 0.5 

int main(){ 
    int i = N + 6; 
    int j = HALF(i); 
    int k = EXPON(j + 0); 
    printf("%d %d %d\n",i, j, k); 
} 

j回报是有点不等于总结的(j+0)可有人请解释一下吗?调用一个函数,但我不明白的逻辑运算

+4

这是什么打印?从逻辑上讲,它应该打印“10,5,125”。 –

+2

我猜这是印刷'10,5,5'? – Kupiakos

+0

@ Kupiakos哦。这就说得通了。他把自己的宏观定义得很差。 –

回答

8

你实际上并没有调用函数,而是使用类似函数的宏。宏执行文本替换,所以扩展此之后:

int k = EXPON(j + 0); 

成为这样的:

int k = j + 0 * j + 0 * j + 0; 

哪个(由于运算符优先级)是一样的:

int k = j + (0 * j) + (0 * j) + 0; 

这是不是你想要什么。

当definining一个函数宏,你应该始终圆括号参数结果表达式:

#define EXPON(x) ((x) * (x) * (x)) 

所以,现在你会得到你所期望的:

int k = ((j + 0) * (j + 0) * (j + 0)); 
+0

你打败了我。几乎相同的答案。 –

+1

你也应该在结果周围加上括号。 – Barmar

+0

@Barmar好的。编辑。 – dbush