關於C++中“++”的問題

        【寫於大三第一學期,做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條時我們就說道後++是返回了一個臨時變量,那這個臨時變量不就是個開銷嗎?通過重載前後++的函數比較,我們可以發現,前++是效率比較高的。所以,以後如果在語句中,前後++都可以時,建議用前++。

 

暫時就想到這麼多,如有新發現,再追加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章