字符串“Hello \ 0”是否等于{'H','e','l','l','o','\ 0'}或{'H','e','l', 'L', '0', '\ 0'}?

时间:2018-01-27 13:44:27

标签: c++ c string

字符串"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'。

2 个答案:

答案 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的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。