2012-12-10 58 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爲您的答覆! –