c++ primer 中的這個習題是不是有錯誤?

練習4.31:本節的程序使用了前置版本的遞增運算符和遞減運算符,解釋為什麼要用前置版本而不用後置版本。要想使用後置版本的遞增遞減運算符需要做哪些改動?使用後置版本重寫本節的程序。

4.10 逗號運算符

vector&::size_type cnt = ivec.size();
// 將把從size到1的值賦給ivec的元素
for(vector&::size_type ix = 0;
ix != ivec.size(); ++ix, --cnt)
ivec[ix] = cnt;

這裡使用前置版本或後置版本的遞增運算符和遞減運算符,有區別嗎?


沒區別


理論上是沒有區別的;但每本書有自己的立場,C++ Primer 的立場看第 4.5 節就知道了。

建議:除非必須,否則不用遞增遞減運算符的後置版本

有C語言背景的讀者可能對優先使用前置版本遞增運算符有所疑問,其實原因非常簡單:前置版本的遞增運算符避免了不必要的工作,它把值加1後直接返回改變了的運算對象。與之相比,後置版本需要將原始值存儲下來以便於返回這個未修改的內容。如果我們不需要修改前的值,那麼後置版本的操作就是一種浪費。

對於整數和指針類型來說,編譯器可能對這種額外的工作進行一定的優化;但是對於相對複雜的迭代器類型,這種額外的工作就消耗巨大了。建議養成使用前置版本的習慣,這樣不僅不需要擔心性能的問題,而且更重要的是寫出的代碼會更符合編程的初衷。


在這段代碼里前置和後置在語義上沒有區別,但是前置的效率會高一些,所以在兩者都可用的情況下,盡量使用前置。

原因是後置的遞增或者遞減操作符為了實現「先使用後遞增或者遞減」,會生成一個臨時變數,而前置遞增或者遞減操作符不用生成一個臨時變數,所以效率高一些。


標準庫將size_type定義為unsigned

前置或者後置在這裡沒區別

====================================

其他情況下 要避免自增自減與其他運算符的混用= =


他那樣寫主要是為了防止下面這種錯誤,前後自增運算符並不是這題的重點。

上面那種寫法前後運算符都行,不過我若非必要,從不用後置運算符。

#include &

#include &

using namespace std;

int main(int argc, char *argv[])

{

vector& vi(100, 3);

for (vector&::size_type i = vi.size(); i &>= 0; --i) {

cout &<&< vi[i] &<&< ;

}

cout &<&< endl;

return 0;

}


在這個題目之中,沒有區別。其他情況未必。題主可以自己好好總結一下。


推薦閱讀:

TAG:編程語言 | 編程 | C | CPrimer |