在xyz.c文件中
int p=2; //global
#define sum(p,i) p+i
int main()
{
printf("%d", sum(5,6));
}
这里的输出是11(而不是8);为什么呢?
答案 0 :(得分:8)
预处理在编译之前进行。当预处理器遇到sum
时,它会将其替换为内容,即您的代码转换为:
int main()
{
printf("%d", 5+6);
}
所以输出11
。预处理器不知道你的任何变量。
答案 1 :(得分:4)
输出绝对是11
因为p
不被视为宏内的变量,所以它就像一个具有调用值的标记;例如(5,6)
。令牌的范围仅限于宏范围。
假设您按如下所示更改宏,则输出将为8:
#define sum(q,i) p+i
// ^^^ token 'q' is unused, so (5,6) is replaced with 'p+6'
答案 2 :(得分:2)
如果您看到程序的.i(intermadiate文件),则可以看到问题。程序可执行的步骤包括以下步骤
1.preprocessing
2.compilation
3.assembler for object code
4.linking
使用以下命令进行第一步 - 预处理
cpp <your program>.c -o <any name to output>.i
如果您这样做,那么在排除此之后您可以看到您的程序的.i文件,您将看到如下
int p=2;
int main()
{
printf("%d", 5 +6);
}
清楚可见为什么答案是11,因为所有的预处理器都会替换你先给出的编译值,所以在预处理之后没有'p'用于全局p。没有p为在程序中使用的后续步骤。
所以你得到了答案11。