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