0

我想测试如果 string append char 的大小会怎样,下面是结果。

我知道字符串以空字符结尾,但为什么结果会这样呢?

#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;
}
4

2 回答 2

2

你的代码没有按照你的想法做。

字符串文字衰减为const char *, 并且char是整数类型。如果您尝试对它们求和,编译器会发现理解这些内容的最简单方法是将chars 转换为ints,因此结果是对字符串文字执行指针算术 - 例如""+'a',在开始后转到内存中的第 97 个字符字符串文字""(如果'a'在您的平台上由 97 表示)。

这导致垃圾被传递给string构造函数,构造函数将在string被构造的内存中存储它在这些内存位置找到的任何内容,直到找到\0终止符。因此,您得到的“奇怪”结果(这是不可重现的,因为字符串表的确切内存布局取决于编译器)。

当然,就标准而言,所有这些都是未定义的行为(您正在访问char超出其界限的数组,除了您添加的情况\0)。

为了使您的代码按照您的意思执行,至少其中一个操作数必须是 type string

string c = string("a") + 'a';

或者

string c = "a" + string("a");

所以编译器会看到相关的operator+重载std::string

于 2012-12-10T19:58:46.450 回答
1

大多数初始化程序都有未定义的行为。例如,考虑:

string a = "" + 'a';

您正在向指针添加chara char。这会将指针前进 char 的 ASCII 值,并使用生成的(未定义的)C 字符串来初始化a.

要修复,请将以上内容更改为:

string a = string("") + 'a';
于 2012-12-10T19:58:14.893 回答