追加Char变换其大小后的字符串

时间:2012-12-10 19:53:27

标签: c++

我想测试字符串是否附加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;
}

2 个答案:

答案 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}}的相关重载。