我在尝试解决一个问题时,不小心写了这个
printf("string1""string2");
令我惊讶的是,它编译并产生了一个连接字符串输出,即:
string1string2
这段代码符合C语言规范吗?
我正在使用gcc 版本4.4.1(Ubuntu 4.4.1-4ubuntu9)
我在尝试解决一个问题时,不小心写了这个
printf("string1""string2");
string1string2
这段代码符合C语言规范吗?
我正在使用gcc 版本4.4.1(Ubuntu 4.4.1-4ubuntu9)
是的,它是这样的。在 C 解析的早期阶段,相邻的字符串字面量被连结在一起。
来自 6.4.5 / 4:
在第 6 阶段的翻译中,由任意相邻的字符和宽字符串字面量记号指定的多字节字符序列被连接成单个多字节字符序列。如果其中任何一个记号是宽字符串记号,则生成的多字节字符序列将被视为宽字符串字面量;否则,它将被视为字符字符串字面量。
#define VERSION "1.0"
#define COMPANY "Trivial Software"
printf("hello world: v. " VERSION " copyright (c) " COMPANY);
或者
puts(
"blah blah blah\n"
"blah blah blah\n"
"blah blah blah\n"
"blah blah blah\n"
);
就像其他人说的一样,是的,它是有效的。我只想补充一点,输入填满几行的长字符串非常有用。您不必使用\
来指示字符串继续,也不需要添加回车符,所以您只需编写:
"very long string "
"that continues over here"
(注意每个字符串末尾的空格,这是一个常见错误。在这种情况下,“string”和“that”将被连接。)