c++ 中的预处理器指令:以下代码的输出是啥?

Posted

技术标签:

【中文标题】c++ 中的预处理器指令:以下代码的输出是啥?【英文标题】:Preprocessors Directives in c++ : what is the output of the following code?c++ 中的预处理器指令:以下代码的输出是什么? 【发布时间】:2020-12-03 19:31:52 【问题描述】:

这里的学生。我有以下一段代码,我对它的输出感到困惑。当我运行这段代码时,它告诉我 C 将是 2,但我虽然它会是 0。为什么是 2?太棒了!

#include <iostream>
using namespace std;

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

int main() 
cout<<C<<endl;
return 0;

【问题讨论】:

#define 语句只是预处理器的纯文本替换,因此C 将替换为1-0+1,在编译器评估时为2。尝试使用#define B (A+1)#define C 1-(B),然后C 将被替换为1-(0+1),其值为0。 #define C 1-(B)比较。 fwiw,不只是你对此感到困惑。 因为您在完全展开表达式后评估它:) 这是一个很好的理由,不要使用#define 作为常量,而是使用实际的 C++ 语言常量,例如:const int A = 0; const int B = A+1; const int C = 1-B; 【参考方案1】:

这里的要点是,您希望在 A 之前评估 B。对于普通的 C++ 代码也是如此,但预处理器只是将指令替换为其内容。

在这种情况下,情况如下.. 采取:

cout<<C<<endl;

C 替换1-B

cout<<1-B<<endl;

B -> A+1

cout<<1-A+1<<endl;

A -> 0

cout<<1-0+1<<endl;

根据通常的rules of C++ operator precedence-+是相等的并且从左到右关联,所以,1 - 0 + 12

【讨论】:

【参考方案2】:

使用 gcc 使用 -E 标志来查看预处理后的输出。

删除包含和其余代码以查看此输出:

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

A
B
C

to come out as:

0
0 +1
1-0 +1

预处理器只是关于文本替换。如果要定义常量,请定义常量:

const int A = 0;
const int B = A+1;
const int C = 1-B;

【讨论】:

以上是关于c++ 中的预处理器指令:以下代码的输出是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Quantlib 预处理器指令

C ++中的宏指令和预处理器指令有啥区别[重复]

来自 C++ 代码的预处理器指令 (_VARIADIC_MAX)

预处理器指令

为啥 C 预处理器不忽略它跳过的块中的无效指令?

小白学习C++ 教程十四C++ 中预处理器