2012-12-10 34 views
0

我想测试一下,如果字符串追加char的大小,下面是结果。字符串追加char changning其大小

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

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

回答

1

您的代码是没有做什么你认为:

要解决,上述改变。

字符串文字衰减到const char *char是一个整数类型。如果您尝试将它们相加,编译器会发现最简单的方法是将char s转换为int s,因此结果是对字符串文字进行指针运算 - 例如, ""+'a'在字符串文字""(如果'a'在您的平台上由97表示)开始之后,将转到内存中的第97个字符。

这导致垃圾被传递给string构造,这将在string内存储被构造无论它发现在存储器这些位置,直到它创立一个\0终止子。因此,你得到的“奇怪”结果(这是不可重现的,因为字符串表的确切内存布局取决于编译器)。

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

为了使你的代码你的意思是什么,操作数至少有一个必须是string类型:

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

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

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

+0

为什么string(“a”)+'\ 0'size是2 //我认为它应该是1 ,,,, string(“\ 0”)+'a'size是1 //我认为它应该是0 ,,,, string(“”)+'\ 0'size is 1 //我认为应该是0 ,,,,, String'size不应该计算空字符? –

+0

'std :: string'是一个*计数的字符串*,即它的长度存储在一个单独的字段中,而'\ 0'字符不作为字符串分隔符 - 它是一个普通字符。它在字符串中的存在不会改变字符串的长度。 –

+0

Thx提前回复。 –

1

您的大多数初始化程序都有未定义的行为。举个例子:

string a = "" + 'a'; 

要添加charchar指针。这会通过char的ASCII值提前指针,并使用生成的(未定义的)C字符串初始化a

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

Thx为您的答复! –