34
char* a="dsa" "qwe";
printf("%s", a);

输出:dsaqwe

我的问题是为什么这件事有效。如果我在两个字符串文字之间给出一个空格或什么都没有,它会连接字符串文字。

这是如何工作的?

4

4 回答 4

47

它由 ISO C 标准定义,相邻的字符串文字组合成一个。

语言有点枯燥(毕竟这是一个标准),但部分6.4.5 String literalsC11

在翻译阶段 6,由任何相邻字符序列和相同前缀的宽字符串文字标记指定的多字节字符序列连接成单个多字节字符序列。

这也在5.1.1.2 Translation phases, point 6同一标准中提到,虽然更简洁一点:

相邻的字符串文字标记被连接起来。

这基本上意味着"abc" "def""abcdef".

它通常对于制作长字符串同时仍然具有良好的格式很有用,例如:

const char *myString = "This is a really long "
                       "string and I don't want "
                       "to make my lines in the "
                       "editor too long, because "
                       "I'm basically anal retentive :-)";
于 2012-08-25T09:58:51.310 回答
12

并回答您未提出的问题,“这有什么用?”

一方面,您可以将常量放在字符串文字中。你可以写

#define FIRST "John"
#define LAST "Doe"

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";

然后,如果您以后需要更改名称,则只需在一处更改即可。
像这样的东西。

于 2012-08-25T11:01:37.380 回答
6

你是在自问自答。

如果我在两个字符串文字之间给出一个空格或什么都没有,它会连接字符串文字。

这是 C 语法的特点之一。

于 2012-08-25T09:54:55.843 回答
1

ISO C标准§5.1.1.2说:-

  1. 相邻的字符串文字标记被连接起来。
  2. 分隔标记的空白字符不再重要。
于 2012-08-25T10:02:56.503 回答