C入门,关于预处理的问题

在学习C primer plus 时遇到这样的代码

#include
#define FORMAT "%s! C is cool!\n"
int main(void)
{
printf(FORMAT,FORMAT);
return 0;
}

通过vs 2022编译后是
%s! C is cool!\n
! C is cool!\n

请问为什么第二行没有%s啊

我们展开来看你就明白了,printf(FORMAT, FORMAT);
相当于printf("%s! C is cool!\n", "%s! C is cool!\n");
那么第一个%s表示的就是占位符,表示后一个字符串,而后一个%s表示普通字符,
所以先输出后面的字符串,应为有\n所以换行再输出! C is cool!\n

FORMAT = "%s! C is cool!\n"
printf(FORMAT, FORMAT);相当于printf("%s! C is cool!\n", "%s! C is cool!\n");
printf();这里面两个参数,第一个参数为输出提示信息,第二个参数为变量;
那么以上可以理解为:printf("%s! C is cool!\n",FORMAT );

那么这样就好理解了吧:%s表示字符串的占位符,表示后一个字符串FORMAT
所以先输出FORMAT 的内容,因为有\n所以换行再输出后面的! C is cool!\n内容,如此就形成了:
%s! C is cool!\n
! C is cool!\n

https://blog.csdn.net/weixin_30364325/article/details/98365134