設i和j已經定義為int型,且i 3,執行jiii 語句後,為何在C語言中j 18,而在C 中j

時間 2022-06-09 10:40:02

1樓:匿名使用者

9: int i = 3;

00401028 mov dword ptr [ebp-4],3

10: int j=0;

0040102f mov dword ptr [ebp-8],0

11: j = (++i)+(++i)+(++i);

00401036 mov eax,dword ptr [ebp-4];dword ptr [ebp-4]就是i,初值為3

00401039 add eax,1;

0040103c mov dword ptr [ebp-4],eax;這時 i = 4;

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,1

00401045 mov dword ptr [ebp-4],ecx; 這時i = 5;

00401048 mov edx,dword ptr [ebp-4]; edx = 5

0040104b add edx,dword ptr [ebp-4]; edx = 5+5

0040104e mov eax,dword ptr [ebp-4]; eax = 5;

00401051 add eax,1

00401054 mov dword ptr [ebp-4],eax;這時 i=6;

00401057 add edx,dword ptr [ebp-4]; 所以edx = 5+5+6 = 16;

0040105a mov dword ptr [ebp-8],edx; 所以j = 16;

這是vc++6.0下的彙編結果,上面有解釋為什麼是16

其他的也一樣,除錯的時候看下彙編就知道了

2樓:only釗

第一個1.是4+4+4

2.是3+3+4

第二個1.是5+5+5

2.是3+5+5

第三個1.是5+5+5

2.是5+3+5

只要記得i++是先用後加++i是先加後用然後自己在不同平臺除錯就知道該平臺的運算方式了……

3樓:匿名使用者

與平臺相關,計算的順序不同,一個從左向右,一個從右向左

4樓:許瑞答問狂

不同的系統,計算方向不同,這就是自加運算子要慎用的原因!

若有如下定義和語句int i=3,j;j=(++i)+(++i)+--i;執行後i,j的值分別是?為什麼?

5樓:金色潛鳥

計算結果 與編譯器有關,與編譯的優化選擇有關。

i 沒問題 得 4。

因為 i=3; --i 得 2, (++i) 得 3, 再 (++i) 得 4。最終 i=4.

j 的結果 就不一定了。

例如: ms vc++ 編譯器優化 /o1, /o2, /og 等, j =12;

/od 和 預設 得 j=14.

至於問 「為什麼」,只有編譯器 生產商 或設計者 才知道。普通使用者難猜。

程式設計師寫程式時要 避免 這種 含義不清,多義性的語句。

例如分開寫成: a=i+1; b=i+1; c=i-1; j=a+b+c; 那就無2義性。也就不必浪費時間去研究j得幾,為何得幾。

6樓:emm名字沒有了

付費內容限時免費檢視

回答您好呀很高興為您解答!

若有如下定義和語句int i=3,j;j=(++i)+(++i)+--i;執行後i,j的值分別是4,14。

希望回答對您有所幫助!

祝您生活愉快![微笑]

提問為什麼

回答i 沒問題 得 4。

因為 i=3; --i 得 2, (++i) 得 3, 再 (++i) 得 4。最終 i=4.

j 的結果 就不一定了。

例如: ms vc++ 編譯器優化 /o1, /o2, /og 等, j =12;

/od 和 預設 得 j=14.

更多8條

設i,j,k均為int型變數,則執行完「for (i=0,j=0;i<=j;i++,j

7樓:

for (i=0,j=0;i<=j;i++,j 連個反括號也木有,怎麼看?不過但看著一部分,for迴圈的語句是不執行的!

8樓:匿名使用者

當第一次迴圈時,i=0,j=0,已經滿足結束條件i<=j, 不會在執行;

9樓:匿名使用者

for(第一部分;第二部分;第三部分)

其中第一部分為初始化用,第二部分判斷用,第三部分跳步用,每次進入for迴圈前都需判斷第二部分是否成立,如果成立,執行迴圈體並按第三部分跳步。

for(i=0,j=0;i<=j;i++,j語句不完整,但i=j會進入迴圈體

10樓:匿名使用者

這個for語句沒什麼作用的 因為初始時候就結束了

11樓:心情不錯

沒有要求輸出。。。錯題

設有定義「int j,i;」,則執行「j=(i=1,1+9)>9?i++||++i:++i;」後,i,j的值為()

12樓:匿名使用者

先執行(i=1,1+9)>9,()表示式的值,是()內最右邊式子的結果,所以是10,10>9,所以第2步是執行i++||++i.

因為之前已執行了i=1,所以i++的取值是1,取值後將i變成2,所以i++||++i的左邊是邏輯真值,根據編譯器的優化,右邊的++i不再計算,所以i++||++i的最終結果是真,即1,所以j=1

c語言 設i,j,k均為int型變數,則執行完下面的for迴圈後,k的值為_____.

13樓:

c語言 設i,j,k均為int型變數,則執行完下面的for迴圈後,k的值為10。

for(i=0,j=10;i<=j;i++,j--) k=i+j;表示,i初始值為0,j初始值為10。判斷i是否小於等於j。如果成立,則k為i+j,i為i+1,j為j-1。

繼續迴圈判斷,直至,i大於j時,結束迴圈。因此,當i=5,j=5時,k=5+5=10時,最後一次迴圈。當i=6,j=4時,結束迴圈。

14樓:一嘆

執行完下面的for迴圈後,k的值為10。

語句的執行過程:

首先進入for迴圈,對i和j進行賦值操作,然後判斷條件,i<=j因為i=0,j=10,所以條件成立執行k=i+j=0+10=10,然後再進入下一次迴圈,迴圈的後執行k=i+j的結果k一直等於10。

當i=6,j=4時迴圈的條件不滿足了,退出迴圈,所以k=10,得出k一直等於10。

15樓:鬆浩慨

k最後一次被賦值時i=j=5,所以k=10

然後i變為6,j變為4,退出迴圈

int i=1,j=2; int k=i+++j; 第二條語句的意思是 k=(i++)+j 還是k=i=(++j)為什麼

16樓:匿名使用者

第二個的語句是 k=(i++)+j這個 因為自身的增加 即i++的優先順序會高於+

希望我的回答能幫助到你

17樓:匿名使用者

因為運算子優先順序為++大於+

所以第二條語句應該是k=(i++)+j

分解為下面的步驟

1.i+j;(由於i++是先使用i值在表示式中進行運算,再自加1)2.k=第1步的結果3;

3.i++;(i從1自加為2)

18樓:匿名使用者

i和j之間有三個+

沒有用()來區分的話 都是從左前右執行的

那麼你的語句以 k=(i++)+j執行

19樓:匿名使用者

k=(i++)+j;

在c語言中,儘可能多的從左到右的結合運算子

20樓:

1:你沒有去判斷n和m這兩個數哪個更大

2:在使用k之前你並沒有賦值

3:第一個for迴圈應該寫成:for(k = m; k <= n; k )

4:第二個for迴圈應該寫成:for(i = 0; i <= j; i )

5:第二個for迴圈內的if和break是一個語句塊 前後加大括號6:建議將j定義為int型別 後面sqrt(k)的值強轉為int型別注意:for迴圈的三個表示式的執行順序

for(表示式1;表示式2;表示式3)

1:執行表示式1

2:執行表示式2

3:如果表示式2為假 退出迴圈

4:如果表示式2為真 執行迴圈體

5:執行表示式3

6:從第2條重新開始執行(即:執行表示式2 進入新的一次迴圈)

設函式f x 的定義域為,則f sinx 的定義域是

小小芝麻大大夢 因為f x 的定義域為 0,1 所以0 sinx 1,因為sinx是以2 為週期的函式,且在0到 區間內滿足0 sinx 1,所以f sinx 的定義域是 2k 2k k屬於整數。正弦函式y sinx,在直角三角形abc中,c 90 ab是 c的對邊c,bc是 a的對邊a,ac是 b...

已知極限的定義 設Xn為一數列,如果存在常數a,對於任意給定的正數 不論它多么小 ,總存在正

未若輕初 關於極限定義的幾點解釋 1 n是項數。是我們解出來的項數,從這一項 第n項 起,它後面的每一項 的值與極限值之差的絕對值小於任何一個給定的數 2 由於 是任給的一個很小的數,n是據此算出的數。可能從第n項起,也可 能從它後面的項起,數列的每一項之值與極限值之差的絕對值小於 是理論上假設的數...

設f為R上單調函式,定義g x f x 0 ,證明函式g在R上每點都右連續

麴飛睢可 解 g x 為r上週期為1的函式,則g x g x 1 函式f x x g x 在區間 0,1 正好是一個週期區間長度 的值域是 2,5 令x 1 t,當x 0,1 時,t x 1 1,2 此時,f t t g t x 1 g x 1 x 1 g x x g x 1 所以,在t 1,2 時...