c語言關於自增自減的問題,C語言裡關於自增自減運算子的問題

2022-02-27 02:48:03 字數 6296 閱讀 1258

1樓:匿名使用者

計算:從右往左,並輸出到「緩衝區」。

2.緩衝區是一堆疊

3.第一步:處理後面的「i--」。8進入緩衝區,i=7。緩衝區:8 <-(指標)

第二步:處理「i++」。7進入緩衝區,i=8。

緩衝區:7 8<-第三步:處理」--i「。

8進入緩衝區,i=7.緩衝區:8 7 8第四步:

處理「++i」  先自增1,然後8進入緩衝區,i=8 .緩衝區: 8 8 7 8

4.輸出緩衝區資料(棧規則):8 8 7 8另外自增 自減 還可能和編譯器有關係

淡定 語法問題 不要太糾結

2樓:喬芝英多凡

有一個簡單的記憶方法,++在前,就是先自增,i在後,就是自增以後再給值;相反,i在前,就是先給出i的值,++在後,就是把值給出來以後再自增。

m=++i;

i先自增,自增以後為9,然後把9給m

n=j++;

先把j的值10給n,然後再自增,j變成了11所以得結果。

如果滿意請採納

3樓:府聽荷戰瑤

先跟你解釋一下不一樣,下面的題就清晰了~

i++先計算在自加1

++i先自加1再計算

i--先計算在自加1

--i先自減1再計算

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

//這裡i先自加1,i=8+1=9,再列印出i,即列印出9printf("%d\n",--i);

//這裡i先自減1,i=9-1=9,在列印出i,即列印出8printf("%d\n",i++);

//這裡先列印i,即列印出8,再自加1,i=8+1=9printf("%d\n",i--);

//這裡先列印i,即列印出9,再自減1,i=9-1=8

4樓:抗新覺宮濤

++在前面表示先進行變數自增,再執行算式,所以m=++i,先執行++i,i變為9,再賦值給m;

++在後面表示先進行算式,再執行變數自增,所以n=j++,先執行n=j,n被賦值為10,再j自增為11

c語言裡關於自增自減運算子的問題

5樓:金色潛鳥

字首加/減 與 字尾加/減 的不同 -- 在於表示式 裡 的 值。

表示式 裡, 字首加 要先自增, 後使用。

表示式 裡, 字首減 要先自減, 後使用。

表示式 裡, 字尾加 要先使用原值。出了表示式後 再自增。

表示式 裡, 字尾減 要先使用原值。出了表示式後 再自減。

a=++i; 字首加 要先自增, 後使用。執行: i=i+1; a=i ; ( i=7; a=7;)

b=i++; 字尾加 要先使用原值。出了表示式後 再自增。執行 b=i; i++; (b=7;i=8)

a=--i; 字首減 要先自減, 後使用。i=i-1; a=i; (i=7;a=7)

b=i--; 字尾減 要先使用原值,執行. b=i.i=i-1; (b=7; i=6)

printf("%d\n",-i++); 字尾加 要先使用原值。出了表示式後 再自增. 列印 -i; (-6) 出了表示式 i=i+1;(i=7)

printf("i=%d\n",i); 列印 i=7

6樓:時尚裝飾萊兒

我在vc6·0上編寫了一下 這是截圖

首先是前兩個7 因為i++是先賦值在進行加一運算,++i是先加一然後再進行賦值操作,所以a,b中儲存著值是7,此時i的值是8

然後是後面兩個7,同理 a為7,b為7,此時i為6同理,-i++中因為++在後面 所以先輸出-6,然後在把i加一 這是i變成了7

最後 根據輸出格式 輸出了  i=7;

7樓:匿名使用者

第一行 i為6 a和b是垃圾值。

第二行a賦予i自增以後的副本a,a為7,而i為7,b被賦給i的副本,b為7,然後i又自增,i為8

列印出來a就是7 b是7 這個時候i是為8的然後a被賦予i自減以後的副本,就是7,而i這時候為7,b又被賦予i的副本為7,然後i又自減為6。

再次列印,a為7,b為7,這時候i為6

下面根據優先順序i++先算,那麼,i++表示式的值為i的副本,那麼就是6,然後負號表示式就是-6。這個-6傳給printf,列印出-6,同時i也自減了,這個時候i為5。

再次列印,i為5。

c語言問題(自增自減)

8樓:安徽新華電腦專修學院

在經歷 -i++之後,i自增變成了9,所以之後的-i--輸出的-9 但是這句話結束之後i自減變成了8

9樓:匿名使用者

i=8, -8--,也就是-8-1 =-9

c語言關於自增自減運算的問題

10樓:匿名使用者

這種問題,沒必要糾結。

如果是 q=(++j)+(++j);//結果是7+7=14連續加法,正常邏輯應該為3*8=24,但實際上,因為編譯器的優化,連加被分割為兩次暫存器運算,等價於:

int edx = (++j)+(++j);

q = edx + (++j);

這樣就成了7+7+8=22

這是優化問題,不必糾結。

這就是實際運算模式,如果明白彙編,可以看懂。

11樓:匿名使用者

這個細心點就好 ++i 和i++的區別 共同點都是i自增1 只是++i和i++前增後不變 在計算過程中一定要注意i值得變化 在算一遍就好

12樓:匿名使用者

c語言的前置++和後置++,稱為自增運算子前置--和後置--稱為自減運算子,下面以自增運算子的區別來加以介紹,自減類似

如果單獨寫 自增運算子為一個語句,二者沒有區別++i; 和 i++; 都是讓i+1賦值給i但是如果把自增運算子寫入到另外表示式中二者就有很大區別了例如i=5;

j=i++;

執行後i為6,j為5

i=5;

j=++i;

執行後i為6,j為6

13樓:雪豹出擊

在一個完整的表示式中使用自增或者自減是由***的。也就是說c語言不保證 p=(i++)+(i++)+(i++),這三個i++的執行順序,並不一定是從左至右分別執行三個i++,有可能是跳著執行,例如q中的三個++j就不是從左至右依次執行的。但是c保證一個完整的表示式中,p,q的i,j分別自增了三次,也就是保證最後的i,j 都是8,但是不保證p,q的值。

所以應該避免在程式中使用類似的聯絡自增自減表示式,以避免出現不可預知的結果啊。

14樓:

這個結果和編譯器有關,沒什麼意義,程式設計時應儘量避免。

15樓:

你看這個**。先求的p結果是14 , 按我們算應該是13,但編譯器是在編譯過程中認為()裡面的優先順序的相同的,而且都是先自增,所以編譯器就把先把這兩個自增計算了,然後就是7+7了。

而下面是一樣的,前二個也是同時進行。後面才進行也就是7+7+8,最後為22.  (我以前也問過,老師用編譯後的彙編**給我解釋的)

16樓:oo鐵戒指

同求,為什麼我算的是21

c語言關於自增自減的問題

17樓:左灬王

一個是先運算後加減 就輸出了x是10  但是再次輸出就是9了  後一個是先加減後輸出 所以是9  再輸出還是9

18樓:匿名使用者

前--表示先自減,再使用變數 n=--y等價於 y=y-1 ; n=y; 這兩步操作

後--表示先用變數,再進行自減 n=x--等價於 n=x ;x=x-1 ;這兩步操作

因此,題目答案為 10 9 d正確

19樓:六十七年

舉個例子吧

i=10;

a = i--; //a = 10

b = i; //b = 9

i=10;

a = --i; //a=9

b = i; //b =9

20樓:衣路肥靖琪

#include

"stdio.h"

void

main

()在vc++中執行結果為10,9,-10-i++中的"-"並不改變i的值,所以輸出"-i++"後i值仍然是10,再自減,輸出9,最後自增,輸出10

21樓:騰颯巫馬天工

++i和i++;區別在於,一個先加後做,一個先做後加,也就說;++在前面就是先加一,再用i,如果在後面就先用i,再加一

c語言的自增自減問題

22樓:勿忘心安

計算:從右往左,並輸出到「緩衝區」。

1、緩衝區是一堆疊

2、第一步:處理後面的「i--」。8進入緩衝區,i=7。緩衝區:8 <-(指標)

第二步:處理「i++」。7進入緩衝區,i=8。

緩衝區:7 8<-第三步:處理」--i「。

8進入緩衝區,i=7.緩衝區:8 7 8第四步:

處理「++i」  先自增1,然後8進入緩衝區,i=8 .緩衝區: 8 8 7 8

3、輸出緩衝區資料(棧規則):8 8 7 8另外自增 、自減 、還可能和編譯器有關係 。

23樓:匿名使用者

函式引數的求值順序是自右向左」更是大錯特錯。樓主,c語言跟大多數語言一樣,沒有規定表示式的求值順序,除了以下幾個順序點:

;(分號,標誌一條語句結束)

,(逗號操作符,函式引數列表裡面的逗號只起分隔作用,不是逗號操作符)

&&和||(邏輯與,邏輯或)

? : (條件運算子)

()(if,while,for, do..while,以及函式呼叫)

這些統稱為順序點,它們的求值順序有規定。我這裡只給你說明逗號操作符,其他的不一一作介紹(不然能寫一大篇呢),你自己參考相關資料。

逗號表示式最簡單的情形如下:

exp1, exp2;

c語言保證exp1在exp2之前求值,並且exp1求值的***保證在逗號之前生成。所以象下面這個逗號表示式:

int i = 1;

i++, (i == 2);

最後的值就是1,因為逗號表示式的前半部分i++的***(i自增1)在逗號之前已經生成,所以當執行到(i == 2)的時候,i的值已經是2了,所以i == 2成立,(i == 2)的值便作為整個逗號表示式的值。

但是,對函式原型,函式定義,函式呼叫,c語言裡面明確說明,引數列表裡面的逗號不是逗號操作符,只起到分隔作用,所以這裡的逗號不再是一個順序點,那它前後的表示式的求值順序就是任意的,並且所有帶***的表示式的***都要等到下一個順序點之後才是確定的,也就是說你只有等到下一個順序點之後,你才能準確得依賴這些表示式產生的***。

所以,像這樣的函式呼叫

foo(i++, ++i);是得不到準確的結果的。因為這裡逗號不是逗號操作符,所以就算編譯器選擇的是從左到右的求值順序,由於c語言不再保證i++的***在逗號之前生成,算到++i的時候,都不確定i到底有沒有自增1,不確定性就在這裡產生了。再者,如果編譯器選擇的是從右到左求值,同樣產生不確定性,這樣一來,傳進函式foo的兩個引數的值就可能不同,那麼最後的結果當然也就不同了。

你這裡一樣,printf是一個函式,

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

是函式呼叫,括號內的所有逗號都不是逗號操作符,而只起到分隔引數的作用。所以++i,--i,-i++這三個表示式的求值順序是任意的,編譯器想怎麼算就怎麼算,不同的編譯器的「想法」可能相同可能不同,結果就可能一樣可能不一樣。這才是樓上的各位得到不同結果的真正原因!!!

樓主要好好參考順序點的定義和作用,並且牢記下面這條規則:

c語言裡面明確指出:在兩個順序點之間兩次改變同一個變數的任何嘗試得到的結果都是不確定的!

你這裡int i=10;

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

的兩個順序點分別是int i=10;的分號,和包圍printf的引數的括號,c語言只保證位於兩個順序點之間的表示式求值產生***在第二個順序點之前生成,但不保證兩個順序點之間所有表示式的求值順序。你這裡++i,--i,-i++三個表示式企圖在兩個順序點前一個分號和()之間三次改變同一個變數i的值,所以結果註定是不確定的。至於為什麼c語言要規定相鄰順序點之間的表示式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運算操作能由編譯器排程安排從而使運算更有效地執行。

另外,站長團上有產品**,便宜***

C語言中自增自減的簡單問題,c語言的自增自減問題

最簡單的體現前自增和後自增,應該這樣,令b a c a 再把b,c的值輸出,看有什麼不同。事實上,區別是這樣的。b a 意思是b a a a 1而c a意思是a先自加在把值賦給c即a a 1 c a 第一個 a的值為4,a也變成4,a 的值是4,a變成5,故第一問b 4 4 8,a 5.第二個a 的...

在C語言中自增自減運算子有什麼作用?

這是一類特殊的運算子,自增運算子 和自減運算子 對變數的操作結果是增加1和減少1 例如 couter couter amount amount 看這些例子裡,運算子在前面還是在後面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表示式的一部分,兩者就有區別了。運算子放在變數前面,那麼在...

關於c語言的問題,關於C語言的問題。

題1 include int main 題2 include int main 題3 include int main 第1個題目 就是判斷while 括號裡面的值是否為真,因為加了個!所以 k 0 n 為真時while裡面的判斷語句就為假,因為 為邏輯與,就是判斷 兩邊的式子是否為真,當k 0為真...