我想测试字符串是否附加char的大小,以下是结果。
我知道字符串以null字符结尾,但为什么结果是这样的?
#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;
}
答案 0 :(得分:1)
大多数初始化程序都有未定义的行为。例如,考虑一下:
string a = "" + 'a';
您正在向char
指针添加char
。这会使指针前移char的ASCII值,并使用生成的(未定义的)C字符串初始化a
。
要修复,请将上述内容更改为:
string a = string("") + 'a';
答案 1 :(得分:1)
您的代码没有按照您的想法行事。
字符串文字衰减到const char *
,char
是整数类型。如果你试图对它们求和,编译器会发现理解这些东西的最简单方法是将char
转换为int
s,因此结果是对字符串文字执行指针算法 - 例如""+'a'
在字符串文字""
开头后转到内存中的第97个字符(如果您的平台上有'a'
表示为97)。
这导致垃圾被传递给string
构造函数,该构造函数将存储在正在构造的string
内部,无论它在内存的这些位置找到它,直到找到\0
终结符。因此,您得到的“奇怪”结果(由于字符串表的确切内存布局取决于编译器,因此不可重现)。
当然,就标准而言,所有这些都是未定义的行为(除了添加char
的情况之外,您正在访问其边界之外的\0
数组。)
要使代码按照您的意思执行,至少有一个操作数必须是string
类型:
string c = string("a") + 'a';
或
string c = "a" + string("a");
所以编译器会看到涉及operator+
的{{1}}的相关重载。