我想问一下为什么这段代码打印出来的是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;
}
答案 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
等于FOO
时FOO
被“分配”到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
预处理器定义只需替换文本,而不关心运算符优先级或计算规则。