C预处理器 - 令牌粘贴 - 令人困惑的结果。这是为什么?

时间:2015-07-22 12:08:51

标签: 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;
}

5 个答案:

答案 0 :(得分:7)

预处理阶段在任何编译之前完成,并在文本上完成。它没有变量或类型的概念(即编译阶段),更不用说实际值(运行时)。

所以,你在做的是:

1) ALPHA(i, i2)
2) i##2-i2
3) i2-i2

所以你最终得到的printf("%d", i2-i2)打印为零。

答案 1 :(得分:6)

预处理器将输出为:

#include <stdio.h> 

int main(void) {
    int i = -1;
    int i2 = -2;
    printf("%d", i2-i2);
    return 0;
}

所以它会打印零

答案 2 :(得分:5)

ALPHA(i, i2)变为i2-i2

根据上面的评论,在编译发生之前,预处理是文本替换。

答案 3 :(得分:5)

与其他编程语言相比,C语言的编译过程略有不同。 在C中, 3阶段涉及从.src文件获取.exe文件。

xyz.c - &gt; PREPROCESSOR - &gt; tmp.c (临时) - &gt; 汇编 - &gt; xyz.obj - &GT; LINKER - &gt; 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的原因。 希望这会帮助你。

答案 4 :(得分:2)

您混淆了i1个字符。尝试使用其他文本编辑器字体。

i ## 2生成的i2恰好在您的计划中有效,其值为-2

获得预期的1 ## 2需要

12

这并不能解释你所期望的负面信号,但我仍然喜欢这个理论。