【寫於大三第一學期,做C語言培訓講解++後】
在C語言中,前++和後++總是讓初學者搞不清方向,當然,當你瞭解了一些方法後,其實也就不難。昨天寫代碼又寫到了++符(哪次沒寫到過?),想起了以前和一個朋友討論++符問題的情景(他老罵我不搞點正經事,搞這種無聊的東西),覺得頗有意思,於是現在總結了一下能想到的所有關於++符的問題(不一定完全正確,還望指教)。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1)首先說一下關於如果分清前後++的問題(寫給初學者)。
如果一個表達式裏有前++或後++的話,如果來計算出表達式的值呢?如:
a = b ++;
我們可以把上面的一句語句拆成兩個語句:
a = b;
b ++;
這兩句話是等價的。而前++如何呢?如:
a = ++ b;
我們則可拆成:
++ b;
a = b;
這個方法很簡單,前++就把++前移,後++就後移,然後就可知答案了。
2)++運算符做左值的問題。
比如有下面兩個語句:
1. a ++ = b;
2. ++ a = b;
第一句話是錯誤的,我們可以這麼理解,在重載後++運算符時,我們都會返回一個臨時變量,比如這麼寫(假設A類裏有個int型變量data):
int operator ++ (int)
{
int temp = A.data;
++ A.data;
return temp;
}
而臨時變量是不可以做左值的。
第二句話當然是正確的,但也不完全正確,爲什麼呢?因爲這是個未定義的值。我們不知道這個表達式結束後a的值到底是多少(這取決於不同的編譯器,也就是我們不知道是先算“=”,還是先求“++”)。
寫到這裏,我突然想到了另一個有趣的語句,比如我們要將指針p指向的空間的值賦給指針q指向的空間,直到p所指的值爲“0”時結束(假設一定會結束),我們可以這麼寫:
while (p)
{
*q = *p;
++ p;
++ q;
}
上面的語句我們可以簡單的寫成:
while ( *q++ = *p++ );上面兩段語句是等價的,咋看一下,怎麼後++做左值了呢?其實這裏並不是後++(臨時變量)做左值,仔細分析下,就可明白是以臨時變量爲地址的內存空間做左值,這當然是合法的。
3)關於做循環變量時前後++的效率問題。
比如一個for循環,我們可能這樣寫
for ( int i=0; i<n; i++ ) { …… }
上面的語句中“i++”我們完全可以換成“++i”,這兩個到底有沒有區別呢?
我認爲是有區別的,剛纔第2條時我們就說道後++是返回了一個臨時變量,那這個臨時變量不就是個開銷嗎?通過重載前後++的函數比較,我們可以發現,前++是效率比較高的。所以,以後如果在語句中,前後++都可以時,建議用前++。
暫時就想到這麼多,如有新發現,再追加。