我认为这个程序会打印值-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;
}
答案 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)
您混淆了i
和1
个字符。尝试使用其他文本编辑器字体。
i ## 2
生成的i2
恰好在您的计划中有效,其值为-2
。
1 ## 2
需要 12
。
这并不能解释你所期望的负面信号,但我仍然喜欢这个理论。