宏函数参数中的C ++加法

时间:2016-04-30 17:35:17

标签: c++ c++11 visual-c++

我从考试中获得了这段C ++代码。我们只想写出程序的输出是什么,我假设输出为'20',但输出为'10'。这是为什么?

#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?

2 个答案:

答案 0 :(得分: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是一个函数,那么它是一个简单的表达式是未定义的行为与宏。

答案 1 :(得分:4)

因为括号不在那里。

宏扩展为

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

从那里一切都出了问题。内联函数而不是宏只会起作用。

要学习的经验:(1)始终在宏定义中括起来。 (2)不要在C ++中使用MACROS!

相关问题