c語言問題!關於自加自減和運算方向i1 iii結果是6誰能解釋一下

2022-09-14 13:45:32 字數 5444 閱讀 2132

1樓:愛問的熊貓

自增或自減運算子的結合方向都是「自右至左」

++i 是先將i 增1 然後再引用到表示式中進行運算,自增自減 與「!、~、+、-、*、&、sizeof、(型別名)」運算子同級,且只比「()、[]、->、.」運算子的運算級別低。

這裡的+、-是正負號運算子

i = (++i) + (++i) 等同於i=1i=i+1 ; i=2 ; i=i+1;i=3i=3+3;

所以結果是6

2樓:匿名使用者

這個問題沒有太多意義,相關的不是++或者--的運算方向,而是編譯器的處理方式。不同編譯器的處理都有可能不同。

如果是面試題,你解釋道編譯器的處理方式就差不多夠了,可以多說一點就是,編譯器在進行兩次++操作的時候進行了錯誤的優化。

如果是自己糾結的話,去看彙編**,瞭解編譯器到底是**出錯了;如果懶的話,光記住結論就可以跳過了:別在一行**裡對同一個變數進行多次++或--操作。

3樓:匿名使用者

這是visual c++ 6.0下的反彙編**:

: int i=1;

0040d748 mov dword ptr [ebp-4],1

5: i=++i;

6: i=(++i)+(++i);

0040d74f mov eax,dword ptr [ebp-4]

0040d752 add eax,1

0040d755 mov dword ptr [ebp-4],eax

0040d758 mov ecx,dword ptr [ebp-4]

0040d75b add ecx,1

0040d75e mov dword ptr [ebp-4],ecx

0040d761 mov edx,dword ptr [ebp-4]

0040d764 add edx,dword ptr [ebp-4]

0040d767 mov dword ptr [ebp-4],edx

根據以上過程:

步驟 結果

(1) i+1--->i (i=2)

(2)i+1--->i (i=3)

(3) i+i---->i (i=6)

說明:(1)i=6並不能說明i=6一定是正確答案,這要根據具體編譯器的演算法而定(有的編譯器可能解釋為5)。

(2)程式設計最好不要這樣這樣的**。

4樓:

i=1;

i=i+1; /*i=2*/

i=i+1; /*i=3*/

i=3+3;

所以等於6.

自增資減運算子優先順序與+ - * / ! & sizeof 同級,這裡去掉括號,結果也等於6.

但是在c#中就等於5了。而且必須有括號。

5樓:_____一葉障目

等於5++i表示i自加1,然後返回加後的值i=1;

i=(++i)+(++i)

先計算第一個++i,這時i=2,然後第一個括號裡面返回值是2然後計算第二個++i,這時i=3,然後第二個括號裡面返回值是3所以是5

6樓:手機使用者

運算是從左到右的首先(++i)這時i=2在加上(++i)這時i=3最後i在相加即i自身相加3+3=6你可以將程式這樣拆分 int i = 1;

i = (++i) ;

i+= (++i) ;

有關c語言中自加自減的問題,求解。。。

7樓:夕暮音塵

i++是在這個表示式取值之後再將i自加1,所以k=2+2+2,而後3個i=i+1

這個其實應該取決於c的編譯器,在gcc編譯後,執行結果k會是9,應該是2+3+4

8樓:竹殤海荼蘼

i++和++i的區別:

兩者都相當於i=i+1,只不過前者是先執行語句後進行自加運算,後者相反。

對於本道題k=i+++i+++i++,編譯器會以k=(i++)+(i++)+(i++)的形式運算,所以在這條語句未執行完之前i的值不自加,故k=2+2+2=6, 完成後i自加i=5.

9樓:

(i++)+(i++)+(i++)

++和+的優先順序得出,然後i++計算了3次,得出i=5,而i++在表示式中i的值沒變,故k=6

c語言中自增自減問題 比如i++ +i. 是整個運算完再給i加1還是 在運算過程中就給i加1影

10樓:

++i 表示i先自增,再參與運算

i++表示i先參與運算,在自增

如果i++和++i單獨成一行,那麼兩者沒有區別(因為沒有i需要參與的運算)

這裡建議少用i++而使用i=i+1; 因為++是最早期c語言為了節約記憶體而設計的符號。現在計算機記憶體這麼多,根本不必要這樣給自己新增麻煩

11樓:汽車安全出行

看++在i的前面還是後面

++i在i的前面,就說明,在這條表示式使用之前,就給i+1了i++就是使用完i之後,再給i+1

例如a=1;

b=++a;//這時候b=1,a=2,給b賦值之前,就已經給a+1了c=a++;//這時候a=2,c=2;執行完之後,a=3;

d=a;//d=3

12樓:唯愛丶等憂傷

舉個例子:

i=1;

5*(++i)=10

此時i=2;

————————————————

i=1;

5*(i++)=5;

此時i=2;

c語言的自增自減問題

13樓:勿忘心安

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

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

14樓:匿名使用者

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

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

15樓:小云小冉

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

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

16樓:釗悟泥迎波

123456789main( )

17樓:匿名使用者

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

C自增,自減不太明白

不同編譯器有不同結果。所以真的程式設計中不太會出現一串 在一起。最好用括號。比如 int a 1 a system.out.print a 是字首就是先對a 1再執行下面的操作 是字尾的話就是先執行下面的操作再返回對a 1 運算過程 第一個 c a a b 1 第一個 a a 3 此時a 3 2 第...

C語言自增自減誰能詳細說明一下謝謝了我都暈了

首先我要指出 回答者winxp0621 的錯誤回答,他完全顛倒了a 和 a 的先後順序,本末倒置了。下面是我的回答 b 先用將b自身加1,然後進行其他運算。b 先進行其他運算,然後b自身加1。a b c 的優先順序最高,就等於是a 5 1 5 1 先運算括號內的,然後相減,即先自加再運算其他的。a ...

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

語法錯誤咱不討論。從邏輯上,if a b else t a a b b t 應該是說,如果a b,則不操作,否則 即a b 交換a,b的值。但是注意 else下如果無大括號,則表示else內只執行第一句。所以應該為 else 下面兩句同理。可能表達不是很清楚,但你應該能看懂吧。希望對你有幫助。if後...