C語言自增問題,c語言的自增自減問題

2022-10-21 14:57:17 字數 6488 閱讀 1630

1樓:凌霄玉雪

我已經用c實現:

#include

int main()

結果為:

output:

1、i=6 k=9

2、i=6 k=12

3、i=6 k=15

4、i=6 k=18

結果分析:

首先看第一個: k=(i++)+(i++)+(i++);

執行過程:首先 k=i+i+i;得到k=9然後執行:i++,i++,i++,得到i=6再看第二個:k=(i++)+(++i)+(i++);

執行過程: 首先:++i,後i為4;

然後執行:k=i+i+i,得到k=12,

然後執行i++,i++得到i=6

第三個:首先執行++i,++i,得到i=5然後執行 k=i+i+i,得到k=15

然後再執行 i++,得到i=6

第四個:就不再囉嗦了,

這些跟優先順序有關,並不是一個一個處理,而是整天處理的。

2樓:匿名使用者

首先你這樣的題目毫無意義,對於不同的編譯器有不同的答案,對於從左到右還是從右到左的編譯結果是不同的。

其次,如果你是程式設計師,你會寫這樣的**嗎?不會,明顯不會,這樣太費腦子了,自己都不懂,更別說看你程式的人了。你不會這麼寫,大家也不會,這樣的問題就不存在了

再次:考試是不考這個的,沒有意義。

3樓:

1、k=(i++)+(i++)+(i++),k=9,i=62、k=(i++)+(++i)+(i++),k=12,i=63、k=(++i)+(++i)+(i++),k=15,i=64、k=(++i)+(++i)+(++i),k=18,i=6

4樓:匿名使用者

1,k=18;i=6

2,k=20;i=7

3,k=23;i=8

4,k=24;i=9

5樓:涼爽微風

1,k=18 i=9

2,k=21 i=9

6樓:匿名使用者

什麼東西啊

題目是什麼啊?

c語言的自增自減問題

7樓:勿忘心安

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

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另外自增 、自減 、還可能和編譯器有關係 。

8樓:匿名使用者

函式引數的求值順序是自右向左」更是大錯特錯。樓主,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語言要規定相鄰順序點之間的表示式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運算操作能由編譯器排程安排從而使運算更有效地執行。

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

9樓:小云小冉

這裡首先說一句,你這種用法應該是不合法的,至少是很不可取的。因為像+、-、*、/這類算術運算子c語言並未規定運算元的求值順序,在不同的編譯器上,有可能先求做運算元,也有可能先求右運算元。所以建議不要採用這種不確定的式子。

你這裡是先求左運算元,也就是先求++n表示式的值,因為是字首自增,表示式(左運算元)值為6,此時n也變為6.然後求右運算元值,即表示式n++;的值,因為是字尾自增,所以表示式的值是6,因此第二運算元的值是6,因此結果是36.之後n變為7.

10樓:釗悟泥迎波

123456789main( )

11樓:匿名使用者

scanf輸入6[x=6], x>5成立, 緊接著無條件執行x++[x=7], 由於前面條件滿足, printf輸出7

scanf輸入4[x=4], x>5不成立, 緊接著無條件執行x++[x=5], 由於前面條件不滿足, printf輸出5, 執行x--[x=4]

因此輸入6時得到輸出7; 輸入4時得到輸出5

12樓:已存在這個名字

輸入6的時候,滿足if語句,x+1,輸出7,程式結束;

輸入4的時候,不滿足if語句,x+1,輸出5,x-1,程式結束。

13樓:傻仔青蛙

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

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

14樓:匿名使用者

++前,表示先自加,後運算。

後++,表示先運算,後自加。

.所以,m=++i;先執行自加,即i=i+1;得i=9;

再運算,m=i;得m=9;

n=j++;先運算,即n=j;得n=10;

再自加,即j=j+1;得j=11;

.結果就是:

i=9,j=11,m=9,n=10.

15樓:匿名使用者

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

m=++i; i先自增,自增以後為9,然後把9給mn=j++; 先把j的值10給n,然後再自增,j變成了11所以得結果。

如果滿意請採納

16樓:看灰過來了

把自增或者自減表示式作為函式引數,本身就應該被避免的,因為不同的編譯系統,在計算的時候,方法並不統一。例如;

i=1;

c=fun(i,++i);

當從左向右計算,那就是c=fun(1,2);

要是從右向左計算,就是c=fun(2,2);

這類問題不必深究,而是應該在呼叫函式之前,將實參的值給它確定了,然後再作為實參去呼叫函式

17樓:唐博

第一段**:

++i是先增加i的值,然後使用。

p=f(i,++i); 是先執行++i,後進行函式呼叫。因為執行了++i以後,i的值已經變成了3,

所以相當於p=f(3,3);

你可以在函式f裡面把a和b的值列印出來,你會發現a和b都是3.

第二段**:

i++是先使用i的值,然後把i的值加1.

所以相當於先執行p=f(2,2);

執行之後,把i的值變成3.答案應該是0.

我懷疑你們老師的課件寫錯了,建議你去問問他。

18樓:windy笨笨狗

主要自增自減問題,方面你記憶,給個方法

x++表示式的值從左到右看x的位置,此時x在++左,還沒有++,故 x++表示式的值就是x值

相反++x,x在++右邊,表示式的值即x+1的值但是不管哪種,只要執行完了,x的值就+1

x--,--x一樣

故: 6時: if(6>5) ,輸出 74時: if(4>5)不滿足, 執行x--,但是此時x已經執行了一遍++,故x在--前為5

x--表示式的值 為5

希望對你有用,望採納

19樓:匿名使用者

m=++i; // i++;m=i

n=j++ ; // n=j,j++

20樓:錢柯偉有錢

這個問題以前我也不懂,現在會了。不懂確實很煩人。首先,i=8,m=++i,前置是先+1,再取值,那麼m=9,而此時的i就是+1之後的運算結果,i=9.

j=10,n=j++.++在後,就是先取值,再+1;那麼n先取值就是10.j的值就是j+1後的值,j=11.

c語言中自增問題 20

21樓:

vc-表示式編譯過程:自增自減連用的問題,複雜表示式求解2010-04-30 21:26vc對表示式的求解過程是遞迴的:

一、它按照優先順序表,最先找優先順序最低的運算子。

二、如果有,則按照結合方向和目數(單目,雙目,三目)將表示式分

開並準備計算,如果沒有,轉四。

三、計算時如果一個運算子的運算元又是一個表示式,則轉向第一步,

按從低到高順序查詢運算子,這樣直到所有運算元都求解完畢後計

算運算子的值,也就是在此遞迴。

四、然後查詢更高優先順序的運算子,轉二。

注:vc在第一次查詢時就把有先使用再自增(自減)地方直接去掉

自增(自減)符號了,也就是說比如a++,a--這樣的符號出現在表

達式中時,直接當成a進行計算,直到整個表示式的值都求出後,再

計算自增自減。

這種運算演算法對於無賦值關係的表示式,其運算結果是和嚴格按優

先級計算的結果相同的(數學上的演算法),但是如果表示式中有賦

值時,其結果就不一定和優先順序一樣了,必須按運算步驟推導才能

得出正確結果。

例1:a=5;b=++a*++a*++a;

首先找到有最低優先順序的*號,兩個*把表示式分成3個部分,其中

第一部分與第二部分就是第一個*的運算元(因為*的結合性自左向右),

現在需要將這兩個運算元計算完才能計算*的值,所以++a又++a得到a=7,

現在a*a=49了。

對於第二個*,因為左邊的運算元已知,所以求右邊的運算元:++a得到a=8

所以49*a=392

例2:a=5;b=a++*a++*a++;的運算過程是先算b=a*a*a得125,然後算a++,a++,a++

得a=8

例3:b=a++*--a+a--*++a;

等價於:

b=a*--a+a*++a;

a++;a--;

於是第一次運算以+為分界

表示式被分成a*--a與a*++a兩段

a*--a中以*為分界把表示式分成a與--a兩段

左側已知,右側--a得到a=4

於是上式變為a*a=16

同理a*++a=5*5=25

現在16+25=41

C語言自增自減問題,c語言的自增自減問題

i 5 應該是a 5吧?x a a a 這種問題沒有必要分析的。在不同的編譯系統下,答案不一樣,在vc 下,答案是24。很直接了當的告訴你,這個無意義的運算在不同的編譯器上可能會有兩種不同的結果.都已經告訴你了.有從左往右,也有從右往左,難道還不明白嗎?這取決於編譯器 此類問題是毫無意義的.因為 像...

C語言自增程序的解題求過程,一個C語言自增程式的解題求過程

樓主還是沒有明白i 與 i的區別。j i i 可以分成i i 1 j i i i i 1 三步。j i i i 可以分解為i i 1 i i 1 j i i i i 1 四步,算出來剛好為27 這是因為 i的運算優先順序是高於整個表示式的,系統在計算這個表示式之前就會先掃描一次,從中提出所有的 i優...

有關C 自增運算子的問題,C 中自增運算子前後置的問題

1 首先,m的結果應該是19吧,我執行了程式,確實等於19 2 自增運算子屬於單目運算子,而 則為雙目運算子,單目運算子的優先順序要高於雙目運算子,所以,m i j 運算順序相當於m i j 3 i以i 1之後的i值為此表示式的值,i 則以i為表示式的值 4 m i j m i j 9 10 19 ...