首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个宏产生2?

为什么这个宏产生2?
EN

Stack Overflow用户
提问于 2019-07-02 12:45:43
回答 3查看 84关注 0票数 2

我目前正在为我的考试学习C++语法和编译器。

为了准备即将到来的考试,我参加了一个C++模拟测试,我遇到了一个问题:“下面代码的输出是什么?”

代码语言:javascript
复制
#include <iostream>
using namespace std;

#define A    0
#define B    A+1
#define C    1-B

int main() {
    cout << C;
    return 0;
}

有谁能解释一下为什么代码输出2而不是?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-02 12:46:41

B扩展为0+ 1C扩展为1- 0+ 1,这说明了结果。

如果你写的话那就不一样了

代码语言:javascript
复制
#define B    (A+1)

这是避免宏的一个很好的理由。在C++中它们在很大程度上是不必要的:模板和constexpr技术是更好的替代品。

票数 5
EN

Stack Overflow用户

发布于 2019-07-02 12:50:59

@Bathsheba'a回答:如果您想调试这样的预处理器问题,在独立文件中分离有趣的部分会很有帮助:

代码语言:javascript
复制
// test.cpp

#define A    0
#define B    A+1
#define C    1-B

C;

以及预处理后的文件显示,例如

代码语言:javascript
复制
g++ -E test.cpp

(在我的机器上)

1 "test.cpp“1”1 "“1 "”1 "test.cpp“1-0 +1”;

请注意,在这里删除包含是很重要的,例如<iostream>使输出非常不可用。

票数 3
EN

Stack Overflow用户

发布于 2019-07-02 14:10:30

简单的宏可以手动展开。

请记住,宏只是一个文本替代。

代码语言:javascript
复制
C

给出

代码语言:javascript
复制
1-B

这就是

代码语言:javascript
复制
1-A+1

这就是

代码语言:javascript
复制
1-0+1

也就是2。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56852826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档