我想测试如果字符串追加字符的大小会怎样,下面是结果。
我知道字符串以空字符结尾,但为什么结果是这样呢?
#include <iostream>
#include <string>
using namespace std;
int main(){
string a = "" + 'a'; //3
string b = "" + '1'; //2
string c = "a" + 'a'; //2
string d = "1" + '1'; //3
string e = "\0" + 'a'; //20
string f = "\0" + '1'; //1
string g = "a" + '\0'; //1
string h = "1" + '\0'; //1
string i = "" + '\0'; //0
string j = "" + '\0'; //0
cout << a.size() << endl;
cout << b.size() << endl;
cout << c.size() << endl;
cout << d.size() << endl;
cout << e.size() << endl;
cout << f.size() << endl;
cout << g.size() << endl;
cout << h.size() << endl;
cout << i.size() << endl;
cout << j.size() << endl;
return 0;
}
最佳答案
您的代码没有按您的想法行事。
字符串字面量衰减为const char *
,而char
是整数类型。如果您尝试对它们求和,编译器会发现理解这些内容的最简单方法是将 char
转换为 int
,因此结果是执行指针运算在字符串文字上 - 例如""+'a'
转到内存中字符串文字开始后的第 97 个字符 ""
(如果 'a'
表示97 在您的平台上)。
这导致垃圾被传递给 string
构造函数,它将存储在正在构造的 string
中,无论它在内存的这些位置找到什么,直到它找到一个 \0
终止符。因此,您会得到“奇怪”的结果(不可重现,因为字符串表的确切内存布局取决于编译器)。
当然,就标准而言,所有这些都是未定义的行为(除了添加 \0
的情况外,您正在访问 char
数组的范围).
为了使您的代码按照您的意思执行,至少有一个操作数必须是 string
类型:
string c = string("a") + 'a';
或
string c = "a" + string("a");
因此编译器将看到涉及 std::string
的 operator+
的相关重载。
关于c++ - 附加 Char 改变其大小后的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808152/