c 自增自減運算彙總(經典)

2021-06-05 16:33:45 字數 3756 閱讀 9841

c++

自增自減問題

在程式設計中,經常遇到

「i=i+1」和

「i=i-1

」這兩種極為常用的操作。變數i被稱為「

計數器」

,用來記錄完成某一操作的次數。c語言為這種計數器操作提供了兩個更為簡潔的運算子,即++和--,分別叫做自增運算子和自減運算子。它們是從右向左結合的一元算術運算子,優先順序為2。學習和應用這兩個運算子時應注意以下幾點:

1 注意表示式的值和變數值的區別

以自增運算子為例,當自增運算子++作用於乙個變數時,例如:當i=3時++i這個算術表示式的值為4,同時變數i的值也由原來的3改變為4。一般情況下,計算表示式後不改變變數本身的值,而++運算子和--運算子組成的表示式計算後,則改變變數的值,這稱為運算子的***。這類運算子在計算表示式時,一定要注意區分表示式的值和變數的值。

2 注意字首運算和字尾運算的區別

仍以自增運算子為例,該運算子可作用在變數之前,例如前面所講的++i,稱為字首運算;也可作用在變數之後,例如i++,稱為字尾運算。在這兩種運算中,表示式的值不同:字首運算後,表示式的值為原變數值加1;字尾運算後,表示式的值仍為原變數值;而變數值不論字首運算還是字尾運算都加1

。自減運算子與自增運算子類似,只要將加1改為減1即可。即字首運算是

「先變後用

」,而字尾運算是

「先用後變」。

3注意運算子的運算物件

自增、自減運算子只能作用於變數,而不能作用於常量或表示式

。因為自增、自減運算子具有對運算量重新賦值的功能,而常量、表示式無儲存單元可言,當然不能做自增、自減運算。只要是標準型別的變數,不管是整型、實型,還是字元型、列舉型都可以作為這兩個運算子的運算物件。如以下四個表示式都是合法的:i+++j++、++i+(++j)、++a+b++、++array[--j];而++6、(i+j)++、『a』

++、++i+++j、(&p)++這五個表示式卻是不合法的。為什麼i+++j++合法,而++i+++j卻不合法?c的編譯器對程式編譯時,從左到右盡可能多地將字元組合成乙個運算子或識別符號,因此i+++j++等效於(i++)+(j++),兩個「++」

作用的物件都是變數,這是合法的;而++i+++j等效於++(i++)+j,第1個「++」

作用的物件是表示式

「i++」,

這是不允許的。

4注意運算子的結合方向

表示式k=-i++等效於k=(-i)++還是k=-(i++)?因為負號運算子和自增運算子優先順序相同,哪乙個正確就得看結合方向。自增、自減運算子及負號運算子的結合方向是從右向左。因此,上式等效於k=-(i++);若i=5,則表示式k=-i++運算之後k的值為-5,i的值為6。此賦值表示式的值即為所賦的值-5。不要因為k=-i++等效於k=-(i++)就先做「++」

運算!這裡採用的是「

先用後變

」,即先拿出i的值做負號「-」

運算,把這個值賦給變數k之後變數i才自增。

5 注意運算子的***

c語言允許在乙個表示式中使用乙個以上的賦值類運算,包括賦值運算子、自增運算子、自減運算子等。這種靈活性使程式簡潔,但同時也會引起***。這種***主要表現在:使程式費解,並易於發生誤解或錯誤。例如,當i=3時,表示式(i++)+(i++)+(i++)的值為多少,各種教材說法不統一:有的認為是9(3+3+3,如譚浩強的《c程式設計》,清華大學出版社,1991);也有的認為是12(3+4+5,如王森的《c語言程式設計》,電子工業出版社,1995)。到底哪乙個說法正確呢?究其原因,「

先用後變,先變後用「中的

「先」和

「後」是乙個模糊的概念,很難給出順序或時間上的準確定論。「先

」到什麼時候,「後

」到什麼程度?沒有此方面的詳細資料可供查詢。

為此,筆者用各種表示式上機測試,給出vc++環境下連續自增(自減)運算規則:

1

、 在一般表示式中和在函式引數中計算的結果相同(這一點與turboc環境不同);

2

、 字尾:同表示式中turbo c的情況相同:先統一取值後依次自增,如:

int a,i=5; a=i+++i+++i++;a=15, i=8.

3

、 字首:前兩個自增同turbo c,即依次自增後統一取值,後面的每個自增後即

取值,如:

int a, i=5; a= ++i+(++i)+(++i); a=22, i=8.

4

、 前字尾混合的情況:

(1)

一般情況:

表示式中自左向右

計算,引數自右向左

運算。字首自增後取值;字尾(或變數)取值依其所處位置而定,有連續多個將統一取值,其自增在語句結束前進行。

(2)

前字尾各有乙個的情況:設int i=5; 由於i++*++i應滿足交換率與++i*i++相同,規定按後者計算故為36。實驗2內容4:int i=5;printf("%d,%d\n", --i, i++*++i ); 列印5,36。

(3)

若i++或++i或兩者有多於乙個的情況:++i有兩個以上在一起時最左邊的連續自增同3、,其餘每個自增後取值,如:int i=5;

printf("%d\n%d\n",--i,(++i)+(i++)+(i++)+(++i));

列印6和25

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+(++i)+(i++));

列印8和40

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+i+(++i)+(++

i));

列印9和49

(4)

函式引數中有括號時,括號引數優先計算,其餘引數仍自右向左計算,如:

int i=9,j=8;printf("%d %d\n", (++i, j--), ++i);

列印8 11

printf("%d %d%d\n", (++i, j--), ++i, i);

列印8 11 10

(5)

最後i的值等於原值加總自增次數減自減的次數.

克服這類***的方法是,盡量把程式寫得易懂一些,即將費解處分解成若干個語句。如:k=i+++j:可寫成k=i+j:i++:而類似(i++)+(i++)+(i++)這類連續自增、自減的運算最好不要使用,以避免疑團的出現,同時也可減少程式出錯的可效能。

在程式設計中,效率和易讀性是一對主要矛盾。為了提高程式的效率,需要用技巧把程式寫得盡可能簡潔一些,但這樣有可能降低程式的可讀性和可理解性。可讀性差的程式容易隱藏錯誤且難於糾正,不易維護,降低了程式的可靠性。鑑於「

軟體危機

」的教訓,人們在程式設計時遵守的基本規範是:可靠性第一,效率第二。為了保證可靠性,程式必須清晰易讀,而表示式的清晰易讀是十分重要的方面。因此,在c程式設計中,要慎重使用自增、自減運算子,特別是在乙個表示式中不要多處出現變數的自增、自減等運算。

C語言 自增( ) 自減( )運算

1.作用 自增運算使單個變數的值增 自減運算使單個變數的值減 2.用法與運算規則 自增 自減運算子都有兩種用法 1 前置運算 運算子放在變數之前 變數 變數 先使變數的值增 或減 然後再以變化後的值參與其它運算,即先增減 後運算。2 後置運算 運算子放在變數之後 變數 變數 變數先參與其它運算,然後...

自增與自減運算

自增與自減運算 自增與自減主要有以下兩種作用 1 無論是前置 後置,都是自身變數加1,都是變數減1 2 當作為表示式時,前置和後置就有區別了。前置運算子的結果是加1或減1之後的結果,前置運算子的結果是加1或減1之前的結果。下面通過乙個簡單的程式進行說明 include using namespace...

自增自減運算子

自增自減運算子 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...