2009-10-14 61 views
1

當我遇到以下問題時,我正在用C寫這段代碼。爲什麼這個除法結果爲零?

#include <stdio.h> 
int main() 
{ 
    int i=2; 
    int j=3; 
    int k,l; 
    float a,b; 
    k=i/j*j; 
    l=j/i*i; 
    a=i/j*j; 
    b=j/i*i; 
    printf("%d %d %f %f\n",k,l,a,b); 
    return 0; 
} 

誰能告訴我爲什麼代碼爲返回第一和第三變量(ka)零?

+5

你有什麼錯誤?你期望輸出是什麼?你得到什麼輸出? – 2009-10-14 19:08:33

+1

請注意,您已獲得/ n而不是\ n。這是你的代碼的複製粘貼,還是你重新輸入了它?最好有一個複製粘貼以避免轉錄錯誤。 – 2009-10-14 19:10:05

+1

我已經改變了標題/問題的內容 – 2009-10-14 19:16:24

回答

6

我想你遇到的是整數運算。您正確地假設lb爲2,但錯誤地認爲ka將爲3,因爲它是相同的操作。但它不是,它是整數算術(而不是浮點算術)。所以,當你做i/j(請考慮使用一些空白),2/3 = 0.33333 ... 它被強制轉換爲int從而變爲0。然後,我們乘以3一遍,0 * 3 = 0

如果您將ij更改爲float s(或將您的數學與(float)強制轉換成數字),則會執行您期望的操作。

10

你問爲什麼k和一個顯示爲零?這是因爲在整數除2/3 = 0(小數部分被截斷)。

+0

擴展的是,當你寫「a = ;」時用「a」聲明的浮動,它只是浮​​動的結果* 。由於表達式中的所有值和變量都是整數,因此結果都基於整數算術。 – Steve314 2009-10-14 19:23:55

+0

這也適用於,因爲他在那裏做相同的操作(i/j ==(int)2 /(int)3 == 0) – 2009-10-14 19:59:08

2

如果您在問爲什麼k和a是0:i/j*j(i/j)*j相同。由於j大於i,因此i/j爲0(整數除法)。 0*j仍然是0,所以結果(k)是0.這同樣適用於a的值。

3

這是由於C編譯器在對待如何劃分INT:

#include <stdio.h> 
int main() 
{ 
int i=2; 
int j=3; 
int k,l; 
float a,b; 
k=i/j*j; // k = (2/3)*3=0*3=0 
l=j/i*i; // l = (3/2)*2=1*2=2 
a=i/j*j; // same as k 
b=j/i*i; // same as b 
printf("%d %d %f %f/n",k,l,a,b); 
return 0; 
} 
4

你還沒說你得到什麼,或者你所期望的,但在這種情況下,它可能容易被猜到。當你做'a = i/j * j'時,你期望結果大致爲0.2222(即2/9),但是你會得到0.0。這是因爲i和j都是int的,因此乘法和(關鍵)除法是在整數數學中完成的,得出0.您將結果賦值給一個浮點數,以便將0轉換爲0.0f。

爲了解決這個問題,轉換至少一個操作數爲浮點除法之前:a = (float)i/j*j);