計算機二級C語言關於自加自減運算子的問題

2022-02-17 02:40:49 字數 5350 閱讀 3460

1樓:匿名使用者

是這樣的,m++,++在後面就先引用(這裡是引用輸出),然後再自加,

++m,就相反了,要先自加,然後再引用。比如:int m=2;a=m++就是先把m=2賦值給a,然後再m自加。而如果是a=++m,就是先m+1,然後把3賦給a。

你上面那個printf("%d%d",m++,++n);就是先輸出m(12)然後m=m+1=13,先n=n+1=35然後輸出35,第二個printf("%d%d\n",n++,++m);先輸出n,由於上一個已經加1得35,所以這裡輸出35,然後n=n+1,m先自加1然後再輸出就是14了。

2樓:匿名使用者

這是一個編譯器相關的問題,不同的編譯器會給出不同的答案不過還是給你講講最普遍的答案吧

m++也叫後加加,他是先返回值後加加的

比如m=1;a=m++;是先把m=1返回給a,m的值再加一,m=2;

++m也叫前加加,他是先增加一後把值返回去的比如m=1;a=++m 意思是m=m+1=2;a=m=2;

上面的過程是

1:列印m=12;n=34+1;

2:列印後m=13,n=35

3:列印n=35;m=13+1;

4:列印後m=14,n=36

3樓:匿名使用者

自增和自減運算子需要從變數在記憶體中實際值的變化角度去理解。

1、m++,意思是先取當前m在記憶體中的值來用,但是用完後,m在記憶體中的值加1,也就是說你下次再用m的值就是m+1了。

2、++m,意思是在用m之前,先將m在記憶體中的值加1,然後再用。

你可能會迷惑:什麼情況下是在呼叫變數在記憶體中的值呢?很簡單,只要是變數出現的地方都是在呼叫變數在記憶體中的值(除變數的定義外)。

自減運算子同理。

c語言的自加自減運算子

4樓:我才是柳隨風

這實在是個令人糾結的問題。

c語言中區分前自增與後自增,它們都有***,尤其是後自增。

前自增可能更好一點,它不產生臨時變數,效率更高一些。

++y相當於:y=y+1;在變數的使用之前先自增。

y++相當於:y; 其它語句... y=y+1;也就是使用它時,它的值不變,在其使用之後的某一時刻但在再次使用它前其值加一。而且不同的編譯器不一定有一致的實現行為。

a=(y++)+(y++)+(y++) 這是一條語句,通常的編譯器實現會將此語句一次性掃描完成。這種情況下,y++會保持其值不變,此語句完成後,將y的值遞增3次。

b=(++y)+(++y)+(++y)這也是一條語句,編譯器掃描完此語句後,先將y遞增3次,再作+運算,將運算結果賦予b,此時b應該為24。 但是不同的系統及編譯器不一定這樣實現,還有可能y依次遞增,其結果是21。

5樓:齊爾大君雅

printf("%d\n",++i);//9i=9printf("%d\n",--i);//8i=8printf("%d\n",i++);//8i=9printf("%d\n",i--);//9i=8printf("%d\n",-i++);//-8i=9printf("%d\n",-i--);//-9i=8前面是輸出值,後面是執行該語句後的i值。-i++應該這樣分,輸出的是-i,執行後i自動加1。i的值始終是正的,最後2個輸出的是-i。

6樓:沐晨長孫振國

第五個:-i

++是先把

-i輸出,在i=i+1;則i

=9;輸出為:

-8第六個:

-i--是先把-i輸出,再i=i-1;則i=8;

輸出為-9;

輸出負數是因前面的

-符號.,而i是正數

7樓:昌秀榮歷媼

a++和++a,

前一個先把a用了

然後再給a加一,後一個

先把a自己增加一然後再

做運算;

例如:x=5;

y=++x;

x先加到6,然後再將x的值應用到表示式y=x中,y值為6x,y都為6

x=5;

y=x++;

x為6,y為5.

同樣,對於你的陣列也適用!

8樓:七彩虹科技****

從左往右看,比如++m,就是m的值先自加1,再呼叫,而m++就是先呼叫m,再自加1. 舉個例子 #include main() a的值先自加1,再呼叫,而b++就是先呼叫m。 --m m-- 同樣的意思,只不過是減法而已

9樓:匿名使用者

第一條,實際上等於a=y+y+y,然後做三次y=y+1;

第二條,實際上是先做3次y=y+1,也就是b=8+8+8,應該是24……得,自己也亂了……

10樓:匿名使用者

如果你只是使用a=y 或b= y的話,語句是完全沒有問題的。但同一語句把y自增了多次,iso ansi c 沒有給出標準,在不同編譯器上的結果就可能不同。自增這樣的操作符雖然能寫出簡潔的**,但濫用的話可能帶來很多問題哦。

你最好把它分成幾條語句,就絕對沒有歧義了。《c primer plus》講解得很清楚

11樓:白龍無馬

第一條是先使用該變數的值再進行累加

第二條是先累加再使用該變數的值。

書上有寫的。

c語言的自增自減問題

12樓:勿忘心安

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

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

13樓:匿名使用者

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

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

14樓:小云小冉

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

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

15樓:釗悟泥迎波

123456789main( )

16樓:匿名使用者

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

17樓:已存在這個名字

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

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

18樓:傻仔青蛙

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

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

計算機二級office和C語言哪個難

計算機二級office 主要考點有 計算機的基礎知識 word的功能和使用 excel的功能和使用 powerpoint的功能和使用。計算機二級c語言需要掌握c語言程式設計,分為筆試和上機兩部分,只有在兩部分都通過的情況下,才能拿到二級c的證書。考計算機二級office需要熟記一些基本概念 基本原理...

關於計算機二級等級考試C語言程式設計題評分的問題

二級程式設計題的評分是按照你執行結果來評的。不知道你那道題是什麼樣子的。機評有其漏洞。對於計算結果的題,那麼很抱歉你估計就是0分了。如果是更改一個檔案的題的話,很有可能你還能得幾分。他不是看你程式編的怎麼樣,而是比對最後執行後生成的結果檔案。所以只能看你抽取的題是什麼型別的了。如果你抽取的是更改一個...

國家計算機二級考試C語言部分,C語言程式設計用的是哪個軟體

c語言程式設計用的是 microsoft visual c c語言考試滿分為100分,其中選擇題目40分,程式填空18分,程式修改18分,程式設計24分。通關的條件是總分達到60分以上而且選擇題要達到20分以上。全國計算機二級c語言考試內容主要包括 c 語言程式的結構 資料型別及其運算 基本語句等1...