在學習C++的過程中經常會遇到一些自增運算符的問題,比如
1.後綴自增運算不能賦值
int tmp = 0;
tmp++ = 10;//error 不能做左值
以過往經驗來看該語句意爲對自增後的 tmp進行賦值,但爲什麼 tmp++後會變成右值呢?本文將通過自定義實現 int來理解使用自增運算符過程中出現的問題 。
class CInt
{
public:
CInt(int val = 0)
{
data = val;
}
CInt& operator ++()//++CInt
{
++data;
return *this;
}
const CInt operator ++(int t)//CInt++
{
const CInt val = *this;
++*this;
return val;
}
/*
operator int()//實現類型轉換的語句
{
return data;
}
*/
private:
int data;
};
前置++與後置++的內部實現不同,前置++實現自增後,返回引用後置++先保存當前對象的副本,實現自增操作後,返回副本。
前置++
CInt& operator ++()//前置++
{
++data;
return *this;
}
參數: void
返回值: 引用(CInt&),返回當前對象要使用引用,如果返回類型爲CInt,返回的對象爲臨時量。
CInt a ;//a.data = 0
++(++a);//a.data = 1, ++a 返回臨時量
後置++
const CInt operator ++(int t)//後置++
{
const CInt val = *this;
++*this;
return val;
}
參數 : int,爲與區分前置++,後置++接受一個整形的形參,一般編譯器將會把0作爲實參;
返回值:與內置類型保持一致,內置類型臨時變量不能做左值,返回類型const CInt。
在計算效果相同的情況下,前置++效率更高,後置++會產生臨時量,調用了一次構造和析構函數。
2.在vs中進行四則運算時,前綴自增優先級最高,後綴自增運算最低。
int b = 3;
int c = (b++)+(b++)+(++b);//??c = 12
分析VS產生的彙編代碼:
分析一下重點代碼可以發現,先進行前綴自增運算,再進行加法運算結果寫入c中,即c=4+4+4 ,然後進行後綴自增運算。
3.printf 函數中,前綴自增運算用一個寄存器存放 i的值,最終返回爲 i的值,後綴自增運算返回當前 i的值。
int i = 0;
printf("%d,%d,%d",i++,++i,i++);//?? 2 3 0
printf函數從右向左一次運算,最右邊的i++返回當前i(0)的值,在進行++運算,再中間的++i運算後,然後最左邊的 i++返回當前i(2)的值,在進行++運算,最後把 i(3)的值返回給中間的++i。
關於C語言前置++和後置++的二三事_luv8818_4BB_新浪博客
C++_運算符重載 總結 - ArrowToMe - 博客園