字符串"Hello\n"
是否等于
{'H','e','l','l','o','\','n','\0'}
或
{'H','e','l','l','o','\n','\0'}
?
在字符串定义中添加转义序列,如:
char arr[] = "Hello\n";
创建如下字符串:
char arr[] = {'H','e','l','l','o','\','n','\0'};
或类似字符串:
char arr[] = {'H','e','l','l','o','\n','\0'};
每次使用char* foo = "HelloWorld!"
之类的声明时,也会添加NULL字符'\ 0'。
答案 0 :(得分:6)
你的第二种解释是正确的,因为你所说的转义序列(换行符)的长度只有1个字符。每次进行此类声明时,NULL字符都会添加到结尾。
你的第一个解释不正确的原因是因为\是转义字符,这意味着它会在它之后立即转义引号。您甚至可以在Stack Overflow的语法高亮显示中看到这一点!
char arr[] = {'H','e','l','l','o','\','n',\0'};
// See how the n is not highlighted --^
很明显,n
在引号之外,被解释为关键字或标识符。
答案 1 :(得分:5)
"Hello\n"
表示{'H','e','l','l','o','\n','\0'}
。它的\n
是换行符。
char* foo = "HelloWorld!"
将指向文字char
数组的衰减指针分配给char*
foo
。是的,字符串文字是null
终止的char数组。
请注意,char* foo = ...
和char foo[]=".."
是两回事。第二个用字符串文字的内容初始化char数组foo
。第一个是简单地指向不可变的文字字符串(foo
指向该文字字符串)。
来自standard 6.7.9
字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。 字符串文字的连续字节(包括终止空字符,如果有空间或数组未知大小)初始化数组的元素。
如果您使用char arr[] = {'H','e','l','l','o','\','n',\0'};
编译代码,则可能会看到消息
error: stray '\' in program
再次从standard 5.2.1开始:
在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠
\
后跟一个的转义序列表示。或更多字符 。所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。