C語言自增減問題總結

2021-07-23 20:15:30 字數 2597 閱讀 7157

c語言自增自減問題總結

在程式設計中,經常遇到

「i=i+1」和「i=i-1」這兩種極為常用的操作。c語言為這種操作提供了兩個更為簡潔的運算子,即++和--,分別叫做自增運算子和自減運算子。它們是單目運算子,是從右向左結合的算術運算子。學習和應用這兩個運算子時應注意以下幾點:

我將自增自減運算子和變數結合在一下的表示式稱為自增自減表示式,如

x++,--i等。通常情況下就有以下的結論:

1『』字首表示式:++x, --x; 其中x表示變數名,先完成變數的自增自減1運算,再用x的值作為表示式的值;即「先變後用」,也就是變數的值先變,再用變數的值參與運算。

2、字尾表示式:x++, x--;  先用x的當前值作為表示式的值,再進行自增自減1運算。即「先用後變」,也就是先用變數的值參與運算,變數的值再進行自增自減變化,。 如

a=8; b=a++; c=++a; 其中賦給變數b的值為表示式(a++)的值,不應該理解為a的值,則b=8, c=10;

3、自增、自減運算只能用於單個變數,只要是標準型別的變數,不管是整型、實型,還是字元型變數等,但不能用於表示式或常量。如:++(a+b),與5++,  const int n=0; n++; 等都是錯誤的。 而i+++j++、++i+(++j)、++a+b++、++array[--j];等,這些都是合法的。

4、再說結合性與結合方向

編譯器對程式編譯時,從

左到右盡

可能多地將字元組合成乙個運算子或識別符號,因此

i+++j++等效於(i++)+(j++),兩個「++」作用的物件都是變數,這是合法的;而++i+++j等效於++(i++)+j,第1個「++」作用的物件是表示式「i++」,這是不允許的。

自增自減運算子是單目運算子,其結合性是從右到左。表示式

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++)的值為多少,各種教材說法不統一。對於這種情況,為了增強程式的可讀性與可移植性,在乙個表示式中,就應該用簡單的自增與自減運算,不用對同一變數進行多次自增自減運算的表示式,否則,其他人可能看不懂,換個執行環境也可能是不同的結果。我相信,在考試試題中也是不會出現象這種有不同結果的試題的,請讀者放心。當然,為了豐富知識,了解一下這些內容也是必要的。

以下內容是經查閱資料所得:用各種表示式上機測試,給出

vc++環境下連續自增(自減)運算規則:

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

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語言問題總結

pow 10,2 的意思是求10的2次方 visual studio 2008除錯程式時老是提示 生成 cmd.exe 時出錯 已啟動生成 配置 debug win32 正在編譯資源清單.正在鏈結.正在嵌入清單.專案 error prj0003 生成 cmd.exe 時出錯。1 個錯誤,0 個警告 ...

C語言中printf中自增自減問題

1 printf函式對於括號內的表示式是從右向左執行,如 printf d,d i i 先執行 i,再執行i 從左向右輸出。2 對於 i和i i是先自加,再呼叫 i 是先呼叫,再自加。1 include void main 結果 22,22 21,22 21,20 22,20 分析 printf語句...

C語言自增自減

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 6a i i的值先變成7,再賦值給a,a的值才為7 b i ...