在简单的cout表达式中使用#define宏

时间:2016-04-13 17:50:34

标签: c++

我想问一下为什么这段代码打印出来的是2而不是0.不#define“将”值分配给宏的名称并计算结果吗?它是如何给出这个答案的?

#include <iostream>
using namespace std;

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

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

3 个答案:

答案 0 :(得分:3)

宏是直接文本替换,这意味着

#define C    1-B

变为

1-A+1

然后A得到扩展,所以我们有

1-0+1

是2.如果你想要0然后停止使用宏而是使用常量变量

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

现在C是0。

答案 1 :(得分:2)

预处理器将C宏扩展为1-B,扩展为1-A+1,扩展为1-0+1,等于2。不要在顺序赋值方面考虑它,但可以通过在宏定义周围添加括号来获得所需的行为。然后,C宏将扩展为(1-B),然后(1-(A+1)),然后(1-((0)+1))等于0

编辑:

例如,下面的代码片段打印42,即使在BAR等于FOOFOO被“分配”到17。这是因为扩展被推迟到实际使用之后。在cout行,BAR仍然等于FOO,但此时FOO现在是42,而不是17。请注意,如果没有先使用#undef进行重新定义宏,这是不好的做法。

#define FOO 17
#define BAR FOO
#define FOO 42
cout << BAR << endl;

答案 2 :(得分:0)

因为C扩展为1-0+1

预处理器定义只需替换文本,而不关心运算符优先级或计算规则。