自增和自減操作符

2022-02-08 06:28:23 字數 1390 閱讀 1873

毫無疑問,自增( ++ )和自減( -- )操作符為物件加1或減1操作提供了方便簡短的實現方式。(程式設計中的宗旨「簡潔即美」!)

它們有前置和後置兩種使用形式:

int i = 0, j;

j = ++i;  // j = 1, i = 1: prefix yields incremented value

j = i++;  // j = 1, i = 2: postfix yields unincremented value

因為前置操作返回加1後的值,所以返回物件本身,是左值。而後置操作返回的則是右值

( 巧記:「前前後後」—— 前置操作返回修改前的值,後置操作返回修改後的值 )。

建議:優先使用前自增操符,只有在必要時才使用後置操作符。

why ?

因為前置操作需要做的工作更少,只需加 1 後返回加 1 後的結果即可。

而後置操作符則必須先儲存運算元原來的值,以便返回未加 1 之前的值作為操作的結果。

對於 int 型物件和指標,編譯器可優化掉這項額外工作。但是對於更多的複雜迭代器型別,這種額外工作可能會花費更大的代價。

因此,養成使用前置操作這個好習慣,就不必操心效能差異的問題。

常常會見到一些在單個表示式中組合使用解引用和自增的操作,舉例如下:

1      vector ivec;           //

empty vector

2int cnt = 10;3

//add elements 10 9 8...1 to ivec

4while (cnt > 0

)5     ivec.push_back(cnt--); //

int postfix decrement

67 vector::iterator iter =ivec.begin();8//

prints 10 9 8 ... 1

9while (iter !=ivec.end())

10     cout << *iter++ << endl; //

iterator postfix increment

由於後自增操作的優先順序高於解引用操作,因此 *iter++ 等效於 *(iter++)。

子表示式 iter++ 使 iter 加 1,然後返回 iter 原值的副本作為該表示式的結果。

因此,解引用操作 * 的運算元是 iter 未加 1 前的副本。

此例如果使用後置自加,則返回的是加 1 後的值,解引用該值將導致錯誤的結果:

ivec 的首個元素沒有輸出,並企圖對乙個結尾之後的多餘元素進行解引用。(此例就是「必要時」的情況)

自增 和自減 操作符

自增操作符和自減操作符經常要在我們自定義的類型別中使用到,而使用時經常會出現問題。現把自己在學習的過程中的 拿出來看一下,也是c primer中的例子如下 ifndef check ptr define check ptr include using namespace std class chec...

過載自增和自減操作符

對於 和 這兩個一元運算子,存在前置和後置的問題,在定義時必須有所區分。1 用成員函式的形式來進行過載 如果 為前增量運算子時,過載函式的一般格式為 type classname operator 如果 為後增量運算子時,過載函式的一般格式為 type classname operator int ...

關於自增自減操作符

c c 中自增自減運算子相信是不少人的乙個困擾,這個問題也一直困擾著我,今天再次翻開書本來看了看,有了些新的體會,所以在這裡記錄下來,同時也與那些像我一樣被困擾的人分享,程式設計大牛可以繞道了,或者有什麼不對的地方請大牛們指正。以 為例,如下程式輸出結果是什麼 int a 0,j 1 a j cou...