2013-01-19 75 views
0

我有這樣的代碼行爲古怪:String類賦值運算符(+ =)的行爲古怪

int main() { 

    string a = "TRY"; 
    string b = "THIS"; 

    a += b[0] + '!';  //This outputs "TRYu"? 
    //a = a + b[0] + '!'; //This outputs "TRYT!" as expected. 

    cout << a; 

} 

應該不是上面的兩個語句是一樣的嗎?

+4

想想'b [0] +'!''是幹什麼的。 – chris

+2

http://en.cppreference.com/w/cpp/language/operator_precedence –

回答

3

號你的第一個例子並不等於

a = a + b[0] + '!' 

但而不是

a = a + (b[0] + '!') 

你知道char是一個數字值。由於b[0]'!'都是字符,b[0] + '!'不會給你一個級聯,而是一個加法(基本上是b[0] + 33)。然後,您將嘗試將代碼b[0] + 33的ASCII字符附加到您的字符串中。由於b[0]'T'(ASCII 84),所以最終得到ASCII碼117的字符:'u'

您必須用std::string("!")替換'!'才能修復代碼並進行串接。

2

沒有,char + char = char;

std::string + char = std::string;

在你的第二個例子。

a = a + b[0] + '!';

string = ((string + char) + char)

如果你總是添加的東西到std::string對象

+2

實際上,'char + char = int' ... –

0

b [0]只是一個字符。所以b [0] +'1'是char + char,這是不好的。內置類型不像字符串那樣有任何花哨的東西,它們只是添加值。 ;)在第二個(工作)示例中,b [0]被添加到a,然後是'!'被添加到,所以總是使用字符串運算符。

1

a += b[0] + '!'; 

b[0] + '!'部分首先計算。由於b[0]是一個字符和'!'是一個char(原始類型),+運算符將它們算術地加上來產生另一個字符,然後用+=運算符將其附加到字符串。