为什么在 C++ 中将字符串和 char 连接起来会返回一个空字符串?

JMM

为什么在 C++ 中连接字符串和字符会返回一个空字符串?

#include <iostream>
#include <string>
#include <assert.h>

int main() {
    std::string s = "hello" + '4';
    assert(s == ""); // why does s equal "" here?
}
彼得

问题出在

std::string s = "hello" + '4';

它不会做任何类似于将 a 附加'4'到字符串的远程操作实际行为与您的期望完全不同。

字符串文字"hello"表示为6的阵列const char,其值'h''e''l''l''o',和'\0'(最后一个字符称为终止空值)。

该值'4'是一个char文字(假设您的编译器使用 ASCII 或兼容字符集,标准不保证)具有52.

该表达式"hello" + '4'随后被编译器视为"hello" + (char)52. Achar是整数类型,因此最终结果"hello" + '4'是指向字符串文字的第 53 个字符的指针(不存在,因为字符串文字"hello"表示为包含六个元素的数组)。

所以结果"hello" + 4是一个指向不存在字符的指针。

sin的初始化std::string s = "hello" + '4';然后将该指针传递给 的构造函数std::string该构造函数错误地假设它传递了空终止字符串的第一个字符的地址。这不是传递的内容,因此结果是未定义的行为。

该断言assert(s == "")实际上并不能保证为真。对于您的编译器和您的主机系统来说,这恰好是真的。但是,由于发生了未定义的行为,任何结果都是可能的(理论上包括在初始化过程中重新安装操作系统s,并且永远不会到达assert())。

要按照您的意图进行操作,您需要强制编译器使用std::string右侧的对象(而不是指针算法)。这样做的一种选择是

 std::string s = std::string("hello") + '4';

这是通过std::string从文字构造 a来工作的"hello"std:string支持operator+()可用于将 a 连接char到 a 的an std::string(并返回std::string用于初始化的 a s)。

以上适用于所有 C++ 标准(自 1998 年以来)。第二种选择(自 C++14 起)是使用文字表示法

std::string s = "hello"s + '4';

它的工作方式基本相同(sin"hello"s形成类型的文字std::string而不是表示为 的数组char,因此加法的结果也是 a std::string)。

事情变成这样的原因是历史性的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中将字符串与char连接起来?

来自分类Dev

当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

来自分类Dev

为什么char * foo()返回空字符串?

来自分类Dev

JavaScript:数组。为什么将空数组与填充数组连接起来会产生字符串?

来自分类Dev

为什么在C ++中将字符串引用成员变量设置为空字符串?

来自分类Dev

在C ++中将char连接到字符串时会发生什么情况?

来自分类Dev

将字符串中的变量连接起来形成一个 URL

来自分类Dev

为什么在动态分配字符串时string :: c_str()返回const char *?

来自分类Dev

为什么此函数返回正确的字符串长度?(增加一个char指针)

来自分类Dev

为什么不能将Postgres中的COMMENT字符串连接起来?

来自分类Dev

为什么在Objective-C中将变量和方法作为字符串传递?

来自分类Dev

为什么将C字符串作为char *传递给函数会导致运行时错误(但将定义为char []的C字符串传递是可以的)?

来自分类Dev

如果在PHP中将UTF-8编码的字符串与ASCII字符串连接起来,结果字符串将是什么编码?

来自分类Dev

Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

来自分类Dev

为什么C ++中的字符串文字(char *)必须是常量?

来自分类Dev

为什么在 C++ 中出现“禁止将字符串常量转换为 'char*'”?

来自分类Dev

在C ++中将char转换为字符串

来自分类Dev

在C ++中将char添加到字符串

来自分类Dev

在C#中将char更改为int或字符串

来自分类Dev

如何在C中将char转换为字符串?

来自分类Dev

为什么取消引用字符串迭代器会产生一个 const char 引用?

来自分类Dev

将字符串与范围连接起来

来自分类Dev

为什么要使用const char *形式的字符串

来自分类Dev

为什么单字母字符串有Char类型?

来自分类Java

为什么密码比字符串更喜欢char []?

来自分类Dev

为什么字符串文字比静态char数组快?

来自分类Dev

为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

来自分类Dev

为什么连接两个空字符串会导致一个空字符串?

来自分类Dev

为什么从字符串常量到'char *'的转换在C中有效但在C ++中无效

Related 相关文章

  1. 1

    如何在C ++中将字符串与char连接起来?

  2. 2

    当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

  3. 3

    为什么char * foo()返回空字符串?

  4. 4

    JavaScript:数组。为什么将空数组与填充数组连接起来会产生字符串?

  5. 5

    为什么在C ++中将字符串引用成员变量设置为空字符串?

  6. 6

    在C ++中将char连接到字符串时会发生什么情况?

  7. 7

    将字符串中的变量连接起来形成一个 URL

  8. 8

    为什么在动态分配字符串时string :: c_str()返回const char *?

  9. 9

    为什么此函数返回正确的字符串长度?(增加一个char指针)

  10. 10

    为什么不能将Postgres中的COMMENT字符串连接起来?

  11. 11

    为什么在Objective-C中将变量和方法作为字符串传递?

  12. 12

    为什么将C字符串作为char *传递给函数会导致运行时错误(但将定义为char []的C字符串传递是可以的)?

  13. 13

    如果在PHP中将UTF-8编码的字符串与ASCII字符串连接起来,结果字符串将是什么编码?

  14. 14

    Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

  15. 15

    为什么C ++中的字符串文字(char *)必须是常量?

  16. 16

    为什么在 C++ 中出现“禁止将字符串常量转换为 'char*'”?

  17. 17

    在C ++中将char转换为字符串

  18. 18

    在C ++中将char添加到字符串

  19. 19

    在C#中将char更改为int或字符串

  20. 20

    如何在C中将char转换为字符串?

  21. 21

    为什么取消引用字符串迭代器会产生一个 const char 引用?

  22. 22

    将字符串与范围连接起来

  23. 23

    为什么要使用const char *形式的字符串

  24. 24

    为什么单字母字符串有Char类型?

  25. 25

    为什么密码比字符串更喜欢char []?

  26. 26

    为什么字符串文字比静态char数组快?

  27. 27

    为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

  28. 28

    为什么连接两个空字符串会导致一个空字符串?

  29. 29

    为什么从字符串常量到'char *'的转换在C中有效但在C ++中无效

热门标签

归档