關於自增自減運算子的一些問題
1、作用是使變數的值增1或減1。
例如:
++i, --i (在使用i之前,先使i的值加(減)1)
i++, i-- (在使用i之後,使i的值加(減)1)
其中++i和i++的作用相當於i=i+1。但是++i和i++不同之處在於++i是先執行i=i+1後,再使用i的值;而i++是先使用i的值後,再執行i=i+1。如果i的原值等於3,請分析下面的賦值語句:
j=++i; //i的值先變成4,再賦值給j,j的值才為4
j=i++; //先將i的值3賦給j,j的值為3,然後i變為4
又例如:
i=3;
printf(“%d”,++i); //輸出4,此時i=4
若改為:
printf(
注意:
(1) 自增運算子和自減運算子只能用於變數,而不能用於常亮或表示式,如5++或(a+b)++都是不合法的。應為5是常量,常量的值不能改變。(a+b)++也不可能實現,假如a+b的值為5,那麼自增後得到的6放到什麼地方呢?無變數可供存放!
(2) ++ 和—的結合方向是“自右向左”(可以參考C語言運算子和結合性表)。一般情況下算數運算子的結合方向為“自左向右”,如果有-i++,i的左面是負號運算子,右面是自加運算子。如果i的原值等於3,若按照左結合性,相當於(-i)++,而(-i)++是不合法的,應為對錶達式不能進行自加自減運算。
如果有printf(“%d”,-i++
注意-(i++)是先用i的原值3加上負號輸出-3,再對i加1,不要認為先加完1後再加負號,輸出-4,這是不對的。
(3) 自增(減)運算子常用於迴圈語句中,使迴圈變數自動加1;也用於指標變數,使指標變數指向下一個記憶體地址。
2、有關次類表示式使用中的一些問題彙總
(1) C運算子和表示式使用靈活,利用這一點可以巧妙地處理許多在其他語言中難以處理地問題。但是應當注意:ANSI C並沒有具體規定表示式中地子表示式地求值順序,允許各編譯系統自己安排。
例如,對錶達式:
a = f1( ) + f2( )
問題:表示式的值是多少呢?
解析:並不是所有地編譯系統都先呼叫函式f1( ),然後呼叫函式f2( )。在一般情況下,先呼叫f1( )和先呼叫f2( )的結果可能相同。但是在有些特殊情況下結果可能不同。有時會出現一些令人容易混淆的問題,務必要小心謹慎。
又如,i的初始值為3,有以下表達式:
int i=3;
int j = (i++)+(i++)+(i++);
問題:表示式的值是多少呢?
解析:有的編譯系統按照自左向右順序執行括號內的運算,求解完第1個括號的值後會實現i的自加,i值變為4,再求第2個括號的值,結果表示式相當於3+4+5,即12。而另外一些系統(如Turbo C和MS C)把3作為表示式中所有i的值,因此3個i相加,得到表示式的值為9。在求出整個表示式的值後i變數再實現自加3次,i的值變為6。
應該避免出現這種歧義性。如果程式設計人員的意願是想得到12,可以寫成下列語句:
int i = 3;
int a = i++;
int b = i++;
int c = i++;
int d = a + b + c;
執行完畢之後,d的值為12,i的值為6。雖然語句複雜,但是不會產生歧義,無論程式移植到哪一種C編譯系統執行,其結果都是一樣的。
(2) C語言中有的運算子為一個字元,有的運算子由兩個字元組成,在表示式中如何組合呢?
問題:如i+++j,是理解為(i++)+j呢?還是i+(++j)呢?
解析:C編譯系統在處理時儘可能多地(自左向右)將若干個字元組成一個運算子(在處理識別符號、關鍵字時也按同一原則處理),如i+++j,將解釋為(i++)+j,而不是i+(++j)。
為避免誤解,最好採取大家都能理解地寫法,不要寫成i+++j的形式,而應寫成(i++)+j的形式。
(3) C語言中類似上述問題還有一些。例如,在呼叫函式時,實參的求值順序的問題,C標準並無統一規定。
例如i的初始值為3,如果有下面的函式呼叫
int i = 3;
printf(“%d, %d”,i,i++);
問題:以上程式輸出結果如何呢?
解析:在有的編譯系統中,從左至右求值,輸出“3, 3”。在多數編譯系統中對函式引數的求值順序是自右而左,上面printf( )函式中要輸出兩個表示式的值(i和i++分別是兩個表示式),先求出第二個表示式i++的值3(i未自加時的值),然後求第一個表示式i的值,由於在求解第二個表示式後,執行i++,使i加1變為4,因此printf( )函式中第一個引數i的值為4。所以上面printf( )函式輸出的是“4, 3”。
以上這種寫法不宜提倡,最好改寫成:
int j = i++;
printf(“%d, %d”,i,j)
總之,不要寫出別人看不懂的、也不知道系統會則樣執行的程式。(不要以為自己很牛,去出一些不能說明什麼問題的題目考別人,這樣的題目直接濾過,只能說明你的程式設計質量很低下)
在看別人的程式時,應該考慮到在此類似上述問題上,不同系統的處理方法不盡相同。應當知道使用C語言時可能出問題的地方,以免遇到問題時不知其所以然。
(4) 使用++ 和 -- 時,常會出現一些人們“想不到”的副作用,初學者要謹慎使用。