c语言中的宏和预处理器


# include <stdio.h>
# define scanf "%s Hello "
int main()
{
printf(scanf, scanf);
return 0;
}

输出:%s Hello Hello

上面提到的代码给出了后面的输出。据我了解,经过预处理阶段的编译,printf语句将变成。printf("%s极客测验"%s极客测验")。但是我仍然很难知道它是如何进一步减少到得到的输出的。

是第一个语句加在第二个语句中还是相反

我想从任何有想法的人那里得到一些帮助。谢谢你

我还是一个业余爱好者,所以我很容易理解一个简单或详细的答案,但我将感谢任何回复。

预处理器在文本上替换如下内容:

#define scanf "%s Hello"
int main() {
...
printf(scanf, scanf);

在某种程度上编译器读成:

int main() {
...
printf("%s Hello", "%s Hello");

此时程序运行,printf()接收到两个字符串"%s Hello"

第一个参数包含"%s",表示将下一个字符串参数放在这里,因此最后的字符串变成

%s Hello Hello">

在运行时printf()第一次替换%s之后,没有出现更多的%s说明符,因此最终结果是您所看到的(并且它是正确的)。

我的意思是:printf()的第一个参数只解析一次;如果那里有单个%s,则进行单个替换。无论单次替换的结果是什么,都不会再次解析,因此出现在第二个参数中的%s不变。

最新更新