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

The*_*eam 1 c++ visual-c++ c++11

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

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

int i=3;

int main() {
    cout  << func(i+2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

如果我把i + 2放在括号中,如下:

cout  << func( (i+2) ) << endl; 
Run Code Online (Sandbox Code Playgroud)

假设输出为'20'.

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

Bar*_*rry 6

这就是宏的工作原理.这是纯文本替换.所以func(i+2)扩展为:

(i+2*i+2)-i+2
Run Code Online (Sandbox Code Playgroud)

也就是说:

2*i + 4
Run Code Online (Sandbox Code Playgroud)

这就是为什么通常会通过过多地将参数括起来来编写宏:

#define func(x) (((x)*(x))-(x))
Run Code Online (Sandbox Code Playgroud)

但实际上,这就是为什么你应该强烈选择函数到宏.虽然括号参数将修复使用func(i+2),但它仍然无法修复使用func(++i)- 如果func函数是宏的未定义行为,则它是一个简单的表达式.