c語言中 i的迷惑

2023-01-04 15:00:15 字數 1560 閱讀 7349

1樓:

j是14。你說是13,是因為對++i理解的還不透徹。

首先int i=5,j;為i,j在記憶體中分別開闢4個位元組的空間(vc中).

第一個++i,是這樣實現的。i+1之後變成6,存入記憶體。

第二個++i,就變成了7,存入記憶體。

而記憶體中i的空間已分配。當前i的值為7.

在執行中間+的時候,是從i中取值的。這就導致表示式成了7+7.

2樓:難得當歌對酒時

看程式的反彙編(vs2008生成),如下:

j=(++i)+(++i);

001e35b5 mov eax,dword ptr [i]

001e35b8 add eax,1

001e35bb mov dword ptr [i],eax

001e35be mov ecx,dword ptr [i]

001e35c1 add ecx,1

001e35c4 mov dword ptr [i],ecx

001e35c7 mov edx,dword ptr [i]

001e35ca add edx,dword ptr [i]

001e35cd mov dword ptr [j],edx

前三行和中間三行作用相同,分別執行兩次 ++i (從右向左執行),而後三行顯然執行的是 i+i ,這正是問題所在 ,如果按照標準規定 ,++i 是個表示式 ,(++i)應返回這個表示式的值 ,因此 ,表示式應相當於 j = 7 + 6 ;

但編譯器卻不是這樣實現的 ,我分別用 dev c++ 和 gcc 編譯了一下 ,結果與vs2008相同 ,我也不太理解 ,或許是我看的標(c

99)準太古老了 ,也可能是編譯器為了優化 ,這本來就是個爭議的問題 ,還是儘量避開這種容易引起歧義的表示式吧 ,畢竟程式設計中可以人為避免這種問題 ,用不著就沒太大必要專研了。

3樓:

賦值語句的優先順序要低於++操作,這個是前置++操作,所以先算++i,因為在一個複製語句中,兩個++i的優先順序都高於賦值,所以就是++i再++i,然後才是j=7+7

4樓:

賦值語句是從右往左的,又因為++前置,所以第二句中第二個i先加1,此時i變成6,再到前面一個時再加1,i變成7,後面也會變成7.

5樓:草野閒羊

第一個(++i)運算的結果是:i為6;

第二個(++i)運算的結果是:i為6+1,即i為7;

此時,不管是前一個i還是後一個i,總之,i是7,那麼i+i=7+7=14;

明之白乎?

6樓:匿名使用者

因為第一個++i=6,然後後面再++i就等於7了,最後7+7就等於14了,它不是變成6後再加7的

7樓:

三樓說對了,補充一點,其實這個沒有為什麼,他的運算機制是這樣,你照用就是了,問太多為什麼反而弄得自己糊塗。

C語言中的 i和i 的區別,C語言程式設計中的 i和i 有什麼區別?

c語言是 cdecl呼叫方式,copy所以函式bai引數是從右往左入棧,先du壓棧zhi的當然先計算,而在壓棧的過程中後置i i 是不dao會改變i的值的,它只會儲存在一個臨時變數裡面,前置的 i i 會直接改變i的值,所以就得到實驗 的結果了!看結果是從右往左算的,其實研究這個沒什麼意義。不同的編...

C語言中的問題,c語言中 p , p 的問題

講一下vc6.0的流程 1.a 0 前置自減運算子先運算,結果使a 02.a a 0 後置運算子在表示式中先使用,後運算,所以a 的值還是0 3.0 a 0 後置運算子在表示式中先使用,後運算,所以a 的值還是0 4.0 a 0 1 1 前置運算子先運算,結果使a變為1 所以結果sum 1 運算後,...

為什麼forinti0i9i在c語言中是

標準抄c語言這樣 寫會出現語法錯誤的,如果使bai用t20,這樣寫肯定會出du錯,無zhi法編譯,正確的寫法是 在函dao數的開始申明變數,之後再使用變數,比如 void fun 後來很多整合開發環境,是支援for int i 0 i 9 i 這種寫法的,不過我的建議還是按照標準的較好,這樣在任何情...