我目前正在为考试学习C ++语法和编译器。
我正在参加C ++ Mock测试,为即将到来的考试做准备,并且遇到一个问题,询问“以下代码的输出是什么?”
#include <iostream>
using namespace std;
#define A 0
#define B A+1
#define C 1-B
int main() {
cout << C;
return 0;
}
有人可以向我解释为什么代码输出 2 而不是 0 吗?
答案 0 :(得分:5)
B
扩展为0+ 1
,而C
扩展为1- 0+ 1
,这说明了结果。
如果你写的话那将是另一回事
#define B (A+1)
这是避免使用宏的一个很好的理由。在C ++中,它们在很大程度上是不必要的:模板和constexpr
技术是更好的替代品。
答案 1 :(得分:3)
除了@ Bathsheba'a的小回答:如果您想调试这样的预处理程序问题,将独立文件中有趣的部分隔离起来将很有帮助:
// test.cpp
#define A 0
#define B A+1
#define C 1-B
C;
,并在预处理后显示文件,例如通过
g++ -E test.cpp
(在我的机器上)给出
# 1 "test.cpp" # 1 "<built-in>" # 1 "<command-line>" # 1 "test.cpp" 1-0 +1;
请注意,删除此处的包含项很重要,例如<iostream>
使得输出几乎无法使用。
答案 2 :(得分:0)
可以手动扩展简单的宏。
请记住,宏只是文本替换。
C
给予
1-B
是
1-A+1
是
1-0+1
是2。
要记住的另一件事是,当测试要求输出一些晦涩的代码段时,显而易见的答案可能是不正确的。