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&
在這個題目之中,沒有區別。其他情況未必。題主可以自己好好總結一下。
推薦閱讀: