是不是有语法错误? 应该是printf(“一个”,两个和“”%s。\ n“,”三个“); 是有效的代码?

看看这段代码:

#include  #define _ONE "one" #define _TWO_AND ", two and " int main() { const char THREE[6] = "three" ; printf(_ONE _TWO_AND "%s.\n", THREE ); return 0; } 

printf有效:

 printf("one" ", two and " "%s.\n", "three" ); 

输出是:

一,二,三。

编译此代码后, gcc既没有错误也没有警告消息。 gcc编译器是否应该以这种方式工作,还是一个bug?

这是标准行为,如果我们查看C99标准草案第5.1.1.2节,相邻的字符串文字会连接在一起。 翻译阶段6段说:

相邻的字符串文字标记是连接的

gcc确实有很多非标准的扩展,但是如果使用-pedantic构建,那么gcc应该警告你是否做了非标准的事情,你可以在文档部分扩展到C语言系列中阅读更多内容。

基本原理在国际标准编程语言的基本原理-C中有所说明,并在第6.4.5节中说明了字符串文字

通过使用反斜杠换行符续行,可以在多行中继续使用字符串,但这要求字符串的延续在下一行的第一个位置开始。 为了允许更灵活的布局,并解决一些预处理问题(见§6.10.3),C89委员会引入了字符串文字串联。 将一行中的两个字符串文字粘贴在一起,中间没有空字符,以构成一个组合字符串文字。 这种对C语言的添加允许程序员将字符串文字扩展到物理行的末尾,而不必使用反斜杠换行机制,从而破坏程序的缩进方案。 未引入显式连接运算符,因为连接是词法结构而不是运行时操作。

您没有任何错误,因为没有错误。

两个字符串"A""B"连接在一起。 这是语言C的惯例。

尝试使用gcc -E显示预处理的源代码。 你会得到这样的东西:

 int main() { const char THREE[6] = "three"; printf("one" ", two and" "%s.\n", THREE ); return 0; } 

然后,按照@ shafik-yaghmour的正确答案