2016-04-30 128 views
1

我有这段代码从考试的C + +代码。我们只是想写出程序的输出是什么,我假设输出是'20',但输出是'10'。为什么是这样?宏函数参数中的C++加法

#define func(x) (x*x)-x 

int i=3; 

int main() { 
    cout << func(i+2) << endl; 
} 

如果我把第i + 2在括号中所示:

cout << func((i+2)) << endl; 

的输出是 '20' 作为假定的那样。

C++如何处理这段代码,使其返回10而不是20?

+0

宏只做文本替换,'func'不是函数。 –

回答

6

这就是宏如何工作。这是纯文本替换。所以func(i+2)扩展为:

(i+2*i+2)-i+2 

这是说:

2*i + 4 

这就是为什么通常宏将被过度圆括号的参数写入:

#define func(x) (((x)*(x))-(x)) 

不过说真的,这是为什么你应该更喜欢函数宏。尽管将参数加括号可以修复func(i+2)中的用法,但它仍不会修复func(++i)中的用法 - 虽然如果func是函数是一个简单的表达式,但与宏一起未定义的行为。

+0

谢谢我不知道这个,我猜教授只是试图通过称它为'func'来赶上我们。 – TheDream

4

因为括号不存在。

的宏扩展到

(i+2*i+2)-i+2 

而且这一切都错在那里。一个内联函数,而不是一个宏只会工作。

要学习的教训:(1)在宏定义中总是用括号括起来。 (2)不要在C++中使用宏!

+0

也谢谢。没有意识到这一点。 – TheDream