C预处理器-标记粘贴-混淆结果。为什么呢?
我以为这个程序会打印值C预处理器-标记粘贴-混淆结果。为什么呢?,c,concatenation,c-preprocessor,C,Concatenation,C Preprocessor,我以为这个程序会打印值-12--2=-10。当我运行它时,它会打印0 我不明白为什么?有什么提示吗? #include <stdio.h> #define ALPHA(x,y) x##2-y int main(void) { int i = -1; int i2 = -2; printf("%d", ALPHA(i, i2)); return 0; } #包括 #定义α(x,y)x##2-y 内部主(空){ int
-12--2=-10
。当我运行它时,它会打印0
我不明白为什么?有什么提示吗?
#include <stdio.h>
#define ALPHA(x,y) x##2-y
int main(void) {
int i = -1;
int i2 = -2;
printf("%d", ALPHA(i, i2));
return 0;
}
#包括
#定义α(x,y)x##2-y
内部主(空){
int i=-1;
int i2=-2;
printf(“%d”,α(i,i2));
返回0;
}
ALPHA(i,i2)
变成i2-i2
根据上面的注释,预处理是编译之前的文本替换。预处理阶段在任何编译之前完成,并在文本上完成。它没有变量或类型的概念(即编译阶段),更不用说实际值(运行时) 因此,您正在做的是:
1) ALPHA(i, i2)
2) i##2-i2
3) i2-i2
因此,您将得到打印为零的
printf(“%d”,i2-i2)
。预处理器将输出为:
#include <stdio.h>
int main(void) {
int i = -1;
int i2 = -2;
printf("%d", i2-i2);
return 0;
}
#包括
内部主(空){
int i=-1;
int i2=-2;
printf(“%d”,i2-i2);
返回0;
}
因此,如果您将
i
和1
字符混淆,它将打印零。尝试不同的文本编辑器字体
i##2
生成的i2
恰好在您的程序中有效,其值为-2
需要1##2
才能获得预期的12
这并不能解释你所期望的负面符号,但我仍然喜欢这个理论。与其他编程语言相比,C语言的编译过程有点不同。 在C语言中,从.src文件获取.exe文件需要三个阶段 xyz.c->预处理器->tmp.c(临时)->编译器->xyz.obj->链接器->xyz.exe 基本上,预处理器逐行读取代码,如果是预处理语句,则只执行预处理指令,并以纯文本形式将代码输出到编译器 对于您的代码,预处理器会将此代码发送给编译器进行编译:
//includes stdio.h from include folder
int main(void)
{
int i = -1;
int i2 = -2;
printf("%d", i2 - i2);
return 0;
}
因此,当编译器编译这段代码时,它将给出打印的结果,仅为0。
这就是运行代码时打印0的原因。
希望这对你有帮助 提示:预处理发生在编译之前,此时变量名只是标记。它们在运行时晚得多的时候得到的值是不相关的。您考虑的是
ALPHA(-1,i2)
。还是ALPHA(-i,12)
?这也会产生-10
。