空字符串加一个int?

1 c++ string int

这是我的代码的一部分:

//num is an int
string s = "" + num;
Run Code Online (Sandbox Code Playgroud)

当我在 Macbook 上的 Xcode 中运行此命令时,s 将被分配给一个奇怪的字符串。有人可以向我解释一下吗?我真的很困惑。谢谢。

Pet*_*ter 5

我假设string是指std::string在标准头中声明的类型<string>。您还没有将其作为上下文给出 - 从技术上讲,根据您提供的信息,它可能是一些前面的内容typedef或宏。

关于原因的解释

string s = "" + num;
Run Code Online (Sandbox Code Playgroud)

给出一个“奇怪的字符串”,它""在内存中表示为constchar一个值为 0 的数组。在表达式 中"" + num, 被""转换为指针(等于零char值的地址),然后+ num给出内存中某个位置的地址,num后面的字符。

如果num非零,则该内存地址可能不存在,或者(如果存在)可能包含任意数据。

无论如何,该指针都会传递给 的构造函数std::string(以便构造s)。该构造函数从给定的地址开始,并不断将数据复制到 中std::string,直到碰巧找到值为零的字符。中间的字符可以是任何东西 - 它们是该内存位置中恰好出现的任何字符。

正式地,C++ 标准将所有这些(通过错误指针访问数据)描述为未定义的行为。这意味着 C++ 标准没有说明允许什么结果,因此任何结果都是允许的。它可能会导致字符串中出现奇怪的数据。操作系统可能会检测到您的程序访问了不应访问的内存,并强制终止您的程序。它可以重新格式化您的硬盘并重新安装操作系统。

假设您只想写入num一个字符串(例如num,值42结果是一个字符串"42"),那么通常的技术是转换numstd::string. 例如;

 std::string s = to_string(num);   // C++11 or later
Run Code Online (Sandbox Code Playgroud)

或者

 #include <sstream>            //  pre_C++11 (albeit valid in C++11)
 std::ostringstream ostr;
 ostr << num;
 std::string s(ostr.str());
Run Code Online (Sandbox Code Playgroud)