迷茫2017-04-17 13:52:54
這是因為:前者先做'
而後者append了兩個字元。其實兩者的輸出應為:
ABCDa5
ABCDrrreeea6
因為
你貼的那個新產生的錯誤的原因是'a' = 97
97 + 97 = 194超出了0-127這個ascii字符的範圍,所以從數值隱式轉換成字符報warning了
大家讲道理2017-04-17 13:52:54
這裡是char類型,不是常數字串,首先根據優先權,會先計算後面的'0'+'a',對於char類型,相加還是一個char類型('a'),所以+= char類型,實際只append了一個字元。
¦ /**
¦ * @brief Append a character.
¦ * @param c The character to append.
¦ * @return Reference to this string.
¦ */
¦ basic_string&
¦ operator+=(_CharT __c)
¦ {
this->push_back(__c);
return *this;
¦ }
ringa_lee2017-04-17 13:52:54
這是因為(1)運算子優先權不同,+
高於+=
;(2)加法的運算元(operand)不同。
s += 's += ('s = s + ('char tmp = 's += 'std::string tmp = s + 'rrreee';
s = tmp + 'a';
';
s += 'a';
' + 'a';
s += tmp;
' + 'a');
' + 'a');
' + 'a';
等價於
rrreee類似
rrreee等價於
rrreee兩個char
類型的變數(字元)做加法,相當於把兩個字元對應的數值相加,所以' '+'a'
等價於0 + 97
,其結果為97
即字元'a'
。
而
rrreee類似
rrreeestd::string
與char
做加法,相當於把字元附加到字串末尾,所以s + ' '
表示在字串末尾增加一個' '
字元。
至於str += 'a' + 'a';//报错
的警告就是 @碎鏡 解釋的原因,即字符溢出。
黄舟2017-04-17 13:52:54
'0' + 'a' 得到的是一個新的字元, 所以 你這樣相當於:
char c = 'rrreee' + 'a';
s += c; // 只是添加了一个字符