【问题标题】:Is the string "Hello\0" equal to {'H','e','l','l','o','\0'} or {'H','e','l','l','o','\0'}?字符串 "Hello\0" 是否等于 {'H','e','l','l','o','\0'} 或 {'H','e','l', 'l','o','\0'}?
【发布时间】:2018-01-27 13:44:26
【问题描述】:

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

【问题讨论】:

  • 您可以通过单独打印每个字符的数值来检查(或在调试器中查看)。
  • 第二。字符串"Hello\\n"等于第一个
  • '\' 不是一段有效的 C++ 代码。
  • 你的标题完全没有意义。
  • @n.m.是的!只是不是字符文字。 "'\'" 看到了吗?并且在 OP 写的地方无效。

标签: c++ c string


【解决方案1】:

您的第二种解释是正确的,因为您正在谈论的转义序列(换行符)只有 1 个字符的长度。每次进行此类声明时,都会在末尾添加 NULL 字符 。

您的第一个解释不正确的原因是因为 \ 是转义字符,这意味着它会立即转义引号。你甚至可以在 Stack Overflow 的语法高亮中看到这一点!

char arr[] = {'H','e','l','l','o','\','n',\0'};
//  See how the n is not highlighted --^

显然,n 在引号之外,被解释为关键字或标识符。

【讨论】:

    【解决方案2】:

    "Hello\n" 表示{'H','e','l','l','o','\n','\0'}。 \n 是换行符。

    char* foo = "HelloWorld!"
    

    将衰减后的指针分配给char 数组到char* foo。是的,字符串文字是 null 终止的字符数组。

    请注意,char* foo = ... 和 char foo[]=".." 是两个不同的东西。第二个使用字符串文字的内容初始化 char 数组 foo。第一个是简单地指向不可变的文字字符串(foo 是指向那个文字字符串)。

    来自standard6.7.9

    字符类型的数组可以由字符串文字或 UTF-8 字符串文字初始化,可选用大括号括起来。 字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

    如果您使用char arr[] = {'H','e','l','l','o','\','n',\0'}; 编译代码,您可能会看到该消息

    error: stray '\' in program
    

    再次来自standard5.2.1:

    在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠\后跟一个或多个字符。一个所有位都设置为 0 的字节,称为空字符,应存在于基本执行字符集中;它用于终止一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2020-02-05
      相关资源
      最近更新 更多