語句str2= str1 + (str1.size() - 1," ")為什麼只有1個空格添加進去了?

str1和str2都是string對象

用VS2015編譯

為什麼無論str1多大,最後只有1個空格添加進去了

然而用

string str3(str1.size()-1, " ");
str2 = str1 + str3;

就可以達到添加str1.size()-1個空格的目的


因為

str2= str1 + (str1.size() - 1," ");

的意思就是(不是很精確但是你意會就好)

str1.size() - 1;
str2 = str1 + " ";

你要寫成

str2= str1 + string(str1.size() - 1," ");

就可以達到你的目的


同學。。構造函數和逗號表達式根本就是兩回事啊。。。

你這個語句str2=str1+(str1.size()-1," ");後面的括弧的返回值是最後一個逗號後面的計算結果,就是" ",當然只會添加一個空格。。你試試看str2=str1+string(str1.size()-1," ");就能滿足你的要求了。。


愣了半天找不到你寫錯的代碼在哪裡。。。原來錯誤的方法你寫在題目里了。。。

言歸正傳,(str1.size()-1," ")其實是等於" "的,因為逗號運算符的操作順序決定的。

而改正後的是構造一個string對象,運用的是string的其中一個構造函數。

所以兩者是完全不一樣的。


請用append


逗號運算符的結果是右邊的表達式的結果。

你試試 : int 1 = 1, 2, 3; 看看結果


感覺大家都沒看清題主到底哪裡出了問題。

其實樓主是沒搞清string str3(str1.size() - 1, " ");的本質是調用了string (size_t n, char c)這個constructor。也就是說

string str3(str1.size() -1, " ")

;相當於

string str3 = string(str1.size() - 1, " ");

所以其秘密不在括弧,而在被省略的string上面。這也是為什麼如果改成

str2 = str1 + string(str1.size() - 1," ");

就成立了。因為顯式得調用了這個constructor。

拓展閱讀:std::basic_string::basic_string


括弧裡面是逗號表達式,返回 " "

後面那個用的是構造函數

C++ primer 書里有


因為括弧里是表達式啊


參考《C++Primer 5th》140頁逗號運算符


推薦閱讀:

C++中類B需要訪問類A的私有成員變數,除了將B聲明為A的友元類外還有其它方法嗎?
如何在#define里使用"#"?
繼承模板類為什麼可以用this訪問基類?
c++模板類拷貝構造函數的問題,有點疑惑?
std::move(expr)和std::forward(expr)參數推導的疑問?

TAG:編程 | 計算機 | C | CC | string |