我目前正在为我的考试学习C++语法和编译器。
为了准备即将到来的考试,我参加了一个C++模拟测试,我遇到了一个问题:“下面代码的输出是什么?”
#include <iostream>
using namespace std;
#define A 0
#define B A+1
#define C 1-B
int main() {
cout << C;
return 0;
}有谁能解释一下为什么代码输出2而不是?
发布于 2019-07-02 12:46:41
B扩展为0+ 1,C扩展为1- 0+ 1,这说明了结果。
如果你写的话那就不一样了
#define B (A+1)这是避免宏的一个很好的理由。在C++中它们在很大程度上是不必要的:模板和constexpr技术是更好的替代品。
发布于 2019-07-02 12:50:59
@Bathsheba'a回答:如果您想调试这样的预处理器问题,在独立文件中分离有趣的部分会很有帮助:
// test.cpp
#define A 0
#define B A+1
#define C 1-B
C;以及预处理后的文件显示,例如
g++ -E test.cpp(在我的机器上)
1 "test.cpp“1”1 "“1 "”1 "test.cpp“1-0 +1”;
请注意,在这里删除包含是很重要的,例如<iostream>使输出非常不可用。
发布于 2019-07-02 14:10:30
简单的宏可以手动展开。
请记住,宏只是一个文本替代。
C给出
1-B这就是
1-A+1这就是
1-0+1也就是2。
另一件要记住的事情是,当一个测试要求输出一些模糊的代码时,显而易见的答案可能是不正确的。
https://stackoverflow.com/questions/56852826
复制相似问题