c++ - 为什么在我向空字符串添加一个字符时返回一个未知值(如 ""+ c)?

标签 c++ string char

请允许我先向您展示我的代码:

void testStringAdd(){
   char c = '$';
   string str = "";
   str += c;//the same as `str = str + c;`
   cout << str << "---";
   cout << "size : " << str.size() << endl;
   str = "" + c;//the same as `str = c + ""`;
   cout << str << "---";
   cout << "size : "<< str.size() << endl;
}

我预计输出是:

$---size : 1

$---size : 1

但是vs2013上的真实输出是:

$---size : 1

---size : 0

这是一个有趣的现象,我想知道为什么会这么奇怪?

注意:如果我编写 string str = "";str == "" 将返回 true。

最佳答案

str = ""+ c; 中,"" 不是 std::string,它是一个 string literal类型为const char[],然后衰减为const char*""+ c 成为指针运算。

在这种情况下,由于 c 具有正值,""+ c 将导致 UB ,这意味着一切皆有可能。程序没有崩溃对您来说可能是幸运的(或不幸的)。

正如评论所指出的,显式转换为 std::string 将解决这个问题。

str = std::string("") + c;

或者使用std::string literal operator (自 C++14 起):

str = ""s + c;

关于c++ - 为什么在我向空字符串添加一个字符时返回一个未知值(如 ""+ c)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36580226/

相关文章:

sql - 如何在存储过程中拆分逗号分隔的字符串?

ruby - 除第一个字符外的小写单词

c++ - push_back on 2D std::vector< std::vector<char*>> value made all the values are the same

c++ - 如何在没有外部库的情况下使用 C++03 约束执行基于正则表达式的字符串操作?

c++ - 找不到 toupper 并删除

c++ - 将缓冲区内容返回到 OpenGL 中的纹理

php - 这个字符 ( Â ) 是什么?如何使用 PHP 删除它?

c - 函数错误“字符之前需要表达式?”

C++设置容器不能删除奇数

c++ - 使用fstream时,文件的所有内容是否都加载到内存中?