i 5,siii)為什麼等於,i 5,s i i i)為什麼等於22?

2022-10-28 19:20:51 字數 4025 閱讀 9356

1樓:匿名使用者

這題確實比較有意思,剛開始我也以為會等於21,後來試了之後才知道等於22,

深入研究一下,把生成的exe給反彙編了才看出來其中的原因...

先從簡單的說起吧,也就是i=5,s=(++i)+(++i);這個結果應該等於14而不是13,為什麼呢?看一下下面的彙編**(通過生成exe反彙編得到)(其中-4ebp是變數i在堆疊中地址,-8ebp是s的地址,eax是暫存器ax)

movl $5, -4(%ebp) ;將i賦值為5

leal -4(%ebp), %eax;取i的地址到ax

incl (%eax) ;將i自增1,此時i為6

leal -4(%ebp), %eax;再取i的地址到ax

incl (%eax) ;再將i自增1,此時i為7

movl -4(%ebp), %eax;將i值放入ax

addl -4(%ebp), %eax;將i值與ax中值相加,得到7+7=14

movl %eax, -8(%ebp);將14放入s中

通過上面的彙編**分析得,先做完兩次自增之後,然後將i空間內的值相加,也就是兩個7相加..同理可分析此題的彙編**,如下

movl $5, -4(%ebp) ;將i賦值為5

leal -4(%ebp), %eax;取i地址到ax

incl (%eax) ;將i自增1,此時i為6

leal -4(%ebp), %eax;再取i地址到ax

incl (%eax) ;i自增1,此時i為7

movl -4(%ebp), %eax;將i值放入ax

movl -4(%ebp), %edx;將i值放入dx

addl %eax, %edx ;將ax與dx相加,並放入dx此時dx=7+7=14

leal -4(%ebp), %eax;取i地址放入ax

incl (%eax) ;i自增1,此時i=8

movl %edx, %eax ;將dx中值放入ax 此時ax=14

addl -4(%ebp), %eax;將ax中值與i相加,得ax=8+14=22

movl %eax, -8(%ebp);將結果ax=22放入變數s中

由於反彙編得到的彙編**太長,所以只選取了其中能解決問題的一段解釋,其它的大家可以自己在debug下反彙編,然後研究一下**,就知道編譯器是怎麼做的了...

注:此彙編**是用gcc得到,其它編譯器做法可能不同,結果可能會有差異

2樓:匿名使用者

有意思,我在機器上操作了下,確實是22

然後試驗了幾下,發現下面幾點:

s=(++i)+(++i) 這個結果s為14,初步理解是對等號右邊前2個變數同時進行了++運算,然後再將2個變數加在一起的。

寫成s=s+(++i)+(++i) 就不會出現問題,此時s為13。

只是對前2個變數同時進行++運算,後面都不會等高手來解釋了。

3樓:匿名使用者

先做(++i) 得出現在的i等於6

再是做6+(++i),(++i)後i等於7,所以這步驟結果為 6+7=13

最後是做13+(++i),(++i)後i等於7+1=8,所以這個步驟的結果為 13+8=21

4樓:

= =奇怪,為什麼我的是24的

做完前增量後i就是8了吧.

5樓:匿名使用者

6+7+8=21啊,怎麼是22啊,你上機操作了嗎?等高手

c語言設i=5,p=(++i)+(++i)+(++i)為什麼等於22

6樓:heart阿飛

i++是先執行整個表示式的值,再加1;++i是先加1後再執行整個表示式的。所以k的值為9,i的值為6。如果i=3,則k=(++i)+(++i)+(++i)執行過後k的值為 18 ,i的值為6

7樓:匿名使用者

不對啊,我在 vs2015 裡測試,結果是24啊.

所以說,以後凡是涉及到這種一大堆++ -- 的題目,你都不要在乎它的結果.因為不同編譯器得出的結果根本就不一樣.c標準委員會也不會硬性規定結果必須是什麼 .

所以 這類題目就是垃圾.隨便做做就好.

c語言中定義i=5.q=(++i)+(++i)+(++i)+(++i).q為什麼等於22啊

8樓:在晴天的雨傘

p=15因為它是先取i的值,然後i再自加1的,所以p是5+5+5=15,運算完之後i自加到8

一般會區別 i++與++i; i++是i先不自加,在語句完後自加,++i先自加

9樓:

建議別鑽這個牛角尖,知道前++先增1再參與運算,後++先參與運算再增1就可以了。i=5.q=(++i)+(++i)+(++i)+(++i);,任何編譯器的解釋都算不出q=22!

如果是i=5,q=(++i)+(++i)+(++i);,則有些編譯器的解釋算出來是q=22,有些則得到q=24的結果。vc++6.0編譯器的結果是前者,因為它把前兩項先算出來儲存在一個臨時變數中,然後再加最後一項來計算的——設這個臨時變數為x,則x=(++i)+(++i)=7+7=14,q=x+(++i)=14+8=22。

而得出24的編譯器則是把前++都先計算完,最後才加起來,即q=8+8+8=24。

10樓:

等於22? 沒搞錯吧?

第一遇到i是6,第二次i是7 ,所以前兩個相加是 7 + 7 = 14 ,遇到第三個時候i是8 ,相加是14+8 = 22 , 遇到第四個是9 , 相加等於22 + 9 = 31 。 我算了幾遍了都是31

c語言基礎:定義i=5,那麼(++i)+(++i)等於幾?為什麼?

11樓:白衣影子

-----------來自華夏聯盟-----------

這個答案根據編譯器的不同而不同 所以建議別寫這種自認為很有難度的**顯示自己的水平,寫出無歧義,高精度的**才是真的水平

還有問題可以繼續問我

12樓:曠若英

我告訴樓主,這個結果是不確定的。

標準c語言語法只定義了一個表示式中只有一個++的計算方法,也就是先用再加和先加再用,對於多個++的情況,並沒有明確規定。也就是具體加多少次完全看編譯器自己的喜好,不過通常的編譯器都會有一次加一次,不過總體只加一次也是合法的。

所以這種問題不是c語言基礎,而是非常高深的問題,直接涉及到了c語言語法的空白區域。

在嚴格的題目中是不會出現類似問題的。

13樓:

一般來說,這種邊緣化語句不同的編譯器有不同的解釋,所以結果會有所不同。但在裡只有兩項,什麼編譯器的解釋都應該是確定的,那就是等於14。為什麼?

i=5,兩次前++就使i=7了,7+7自然是14!

14樓:與子如初見

答案是14哦。

因為是從右邊編譯的,從左邊運算。先算右邊的++i,再算左邊的++i,完了i = 7,再i+i = 14.

15樓:匿名使用者

優先順序別問題,++i 先計算了兩次在執行中間的加號,所以是7+7=14;

16樓:天平

13右結合性 先算右邊的++i

i=6在算左邊的++i

i=76+7=13

17樓:球探觀察

13,左括號裡的++i是先加一再計算,右括號裡的++i是在6的基礎上加一再計算,所以即為6+7,結果為13.

int i=5;p=(++i)+(++i)+(++i);printf("%d",p);為什麼結果為22,不是6+7+8嗎,網上是說i加兩次?

18樓:

這種問題有二義性,在不同的編譯系統中,答案不一樣。在vc++ 2010下測試,結果是:24。樓主多關心下其他問題,這種問題沒有必要深究。

19樓:匿名使用者

樓上說的有道理,這種東西好像是沒什麼意義,你自己編的時候不會自己給自己繞彎彎

複數5i34i等於多少,複數i是多少其平方3次方4次方5次方分別是多少

5i 3 4i 5i 3 4i 3 4i 3 4i 20 15i 9 16 4 5 3i 5 5i 3 4i 5i 3 4i 3 4i 3 4i 20 15i 9 16 4 5 3i 5 祝您考試的時候一帆風順 做法簡解 有參考資料 複數i是多少 其平方 3次方 4次方 5次方分別是多少 1 i的平...

酷睿I5與酷睿I7有什麼區別,酷睿i5和i7的區別

1 core i5 7xx core i7 8xx與core i7 9xx最大的區別是 core i7 9xx採用的是1366介面,而core i5 core i7 8xx採用1156介面,分別只能用在x58和p55 p57主機板上,兩種介面不能相容。2 1156的core i5 i7在記憶體控制器...

聯想i5 4200,i5是什麼意思

尊敬的聯想使用者您好,i5一般指的是聯想電腦所採用的cpu是intel公司的i5處理器。i5是英特爾核心處理器的一個型號,cpu 有i3 i5 i7這幾個檔次。是處理器的型號,意思是酷睿i5處理器,型號越高效能越好 英特爾酷睿處理器當中的一個,還有i3 i7等!2008年11月17日 英特爾釋出co...