我从考试中获得了这段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?
答案 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!