關於自增自減運算子的一些問題

2021-07-05 10:48:01 字數 3208 閱讀 3831

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(「%d

」,i++);  //

輸出3,此時i=4

注意:

(1)自增運算子和自減運算子只能用於變數,而不能用於常亮或表示式,如5++或(a+b)++都是不合法的。應為5是常量,常量的值不能改變。(a+b)++也不可能實現,假如a+b的值為5,那麼自增後得到的6放到什麼地方呢?無變數可供存放!

(2) 

++ 和—的結合方向是「自右向左」(可以參考c語言運算子和結合性表)。一般情況下算數運算子的結合方向為「自左向右」,如果有-i++,i的左面是負號運算子,右面是自加運算子。如果i的原值等於3,若按照左結合性,相當於(-i)++,而(-i)++是不合法的,應為對表示式不能進行自加自減運算。

如果有printf(「%d」,-i++);,則先取出i的值3,輸出-i的值-3,然後i

增加為4

注意-(i++)

是先用i的原值3加上負號輸出-3,再對i加1,不要認為先加完1後再加負號,輸出-4,這是不對的。

(3) 

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) 使用++ 和 -- 時,常會出現一些人們「想不到」的***,初學者要謹慎使用。

自增自減運算子

自增自減運算子 i 先使用i,然後i i 1 i 先使用i,然後i i 1 i 先i i 1然後使用i i 先i i 1 然後使用i 以下使用vc下除錯的結果,不同的編譯器可能有不同的結果。i 3 例1printf d i 結果輸出4 例2printf d i 結果輸出3 例3printf resu...

自增 ,自減 運算子

自增1運算子記為 其功能是使變數的值自增1。自減1運算子記為 其功能是使變數值自減1。自增1,自減1運算子均為單目運算,都具有右結合性。可有以下幾種形式 i i自增1後再參與其它運算。i i自減1後再參與其它運算。i i參與運算後,i的值再自增1。i i參與運算後,i的值再自減1。在理解和使用上容易...

自增和自減運算子

自增和自減運算子 在c語言中有許多運算子,邏輯運算,賦值運算,關係運算 其中最難理解的莫過於自增 和自減 運算了。自增 自減 有兩種方式,下面分別進行分析。1 在前。i i 其用法是在整個表示式運算之前先進行自增 自減 運算,然後再進行表示式運算。例如進行如下計算 intx y x 8 y x 執行...