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?
这就是宏的工作原理.这是纯文本替换.所以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函数是宏的未定义行为,则它是一个简单的表达式.