两个字符串文字的连接如何工作?

grv*_*grv 24 c string

char* a="dsa" "qwe";
printf("%s", a);
Run Code Online (Sandbox Code Playgroud)

输出:dsaqwe

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

这是怎么回事?

pax*_*blo 33

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

语言有点干(毕竟这是一个标准),但6.4.5 String literalsC11 部分说明:

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

这里也提到了C11,更简洁一点:

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

这基本上意味着5.1.1.2 Translation phases, point 6没有什么不同"abc" "def".

它在制作长字符串时仍然很有用,同时仍然具有良好的格式:

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 :-)";
Run Code Online (Sandbox Code Playgroud)

  • 我担心我有更糟糕的肛门保留情况,因为我觉得有义务使用 `const char *` 作为这个定义`:)` (2认同)

Mr *_*ter 8

并回答你未提出的问题,"这有什么用?"

首先,您可以将常量放在字符串文字中.你可以写

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

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";
Run Code Online (Sandbox Code Playgroud)

然后,如果您稍后需要更改名称,则只需在一个位置更改它.
像这样的东西.

  • 好的例子。您可以使用 `<inttypes.h>` 中定义的 `printf` 和 `scanf` 宏添加另一个宏:`PRId32`,... (2认同)

Joe*_*Joe 6

你是在自问自答.

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

这是C语法的一个特性.