为什么此宏产生2?

时间:2019-07-02 12:45:43

标签: c++ macros

我目前正在为考试学习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 吗?

3 个答案:

答案 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。

要记住的另一件事是,当测试要求输出一些晦涩的代码段时,显而易见的答案可能是不正确的。