为什么可以在没有错误的情况下编译由空格,制表符或“\ n”分隔的两个字符串文字?
int main()
{
char * a = "aaaa" "bbbb";
}
“aaaa”是一个字母* “bbbb”是一个char *
没有特定的连接规则来处理两个字符串文字。显然,以下代码在编译期间出错:
#include <iostream>
int main()
{
char * a = "aaaa";
char * b = "bbbb";
std::cout << a b;
}
这种连接是否适用于所有编译器? “aaaa”的空终止在哪里? “aaaabbbb”是一个连续的RAM块吗?
答案 0 :(得分:9)
如果您看到例如它在第6阶段this translation phase reference:
连接相邻的字符串文字。
这就是这里发生的事情。您有两个相邻的字符串文字,它们连接成一个字符串文字。
这是标准行为。
它只适用于字符串文字,而不是你注意到的两个指针变量。
答案 1 :(得分:5)
在本声明中
-1
编译器在编译的某个步骤之前,在语法分析中将相邻的字符串文字视为一个文字。
因此对于编译器,上述语句等同于
char * a = "aaaa" "bbbb";
即编译器只存储一个字符串文字char * a = "aaaabbbb";
答案 2 :(得分:4)
根据C(和C ++)标准的规则连接相邻的字符串文字。但是相邻标识符(即变量"aaaabbbb"
和a
)不存在这样的规则。
引用,C ++ 14(N3797草案),§2.14.5:
在翻译阶段6(2.2)中,相邻的字符串文字是 级联。如果两个字符串文字都具有相同的encoding-prefix, 生成的连接字符串文字具有该encoding-prefix。如果 一个字符串文字没有编码前缀,它被视为一个字符串 与另一个操作数相同的编码前缀的文字。如果是UTF-8 字符串文字标记与宽字符串文字标记相邻 程序是不正确的。任何其他连接都是 有条件地支持实现定义的行为。
答案 3 :(得分:3)
在C和C ++中,将相邻的字符串文字编译为单个字符串文字。例如:
"Some text..." "and more text"
相当于:
"Some text...and more text"
由于历史原因:
最初的C语言是在1969 - 1972年设计的,当时计算仍由80列打孔卡主导。其设计人员使用了80个列设备,如ASR-33 Teletype。这些设备没有自动换行文本,因此真正有动力将源代码保存在80列之内。在他们最终转向自由格式之前,Fortran和Cobol有明确的延续机制。
Dennis Ritchie(我假设)意识到语法中没有歧义,并且通过使编译器连接到相邻的简单方便,可以使长ASCII字符串适合80列,这是一种辉煌的表现。文字字符串。无数C程序员对这个小功能表示感谢。
一旦该功能进入,为什么它会被移除?它不会导致悲伤,而且经常使用。我希望有更多的语言能够拥有它。现代趋势是使用三引号或其他符号扩展字符串,但C中此功能的简单性从未超出过。
答案 4 :(得分:2)
并排放置的字符串文字在转换阶段6(在预处理器之后)连接在一起。也就是说,
"Hello," " world!"
产生(单个)字符串"Hello, world!"
。如果两个字符串具有相同的编码前缀(或者两者都没有),则生成的字符串将具有相同的编码前缀(或没有前缀)。
(source)