2009-10-14 21 views
1

J'écrivais ce code en C lorsque j'ai rencontré le problème suivant.Pourquoi cette division aboutit à zéro?

#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; 
} 

Quelqu'un peut-il me dire pourquoi le code retourne zéro pour les première et troisième variables (k et a)?

+5

Quelles sont les erreurs? Qu'attendez-vous de la sortie? Quel résultat obtenez-vous? –

+1

notez que vous avez/n au lieu de \ n. Est-ce un copier-coller de votre code, ou l'avez-vous re-tapé? Mieux vaut avoir un copier-coller pour éviter les erreurs de transcription. –

+1

J'ai changé le titre/question à ce que je pense était destiné –

Répondre

6

Ce que je pense que vous rencontrez est arithmétique entier. Vous supposez correctement l et b être 2, mais supposer à tort que k et a sera 3 parce que c'est la même opération. Mais ce n'est pas le cas, c'est l'arithmétique entière (plutôt que l'arithmétique en virgule flottante). Donc, quand vous faites i/j (s'il vous plaît envisager d'utiliser des espaces), 2/3 = 0,33333 ... qui est converti en int et devient 0. Puis nous multiplions par 3 encore, et 0 * 3 = 0.

Si vous modifiez i et j pour être float s (ou piment vos maths avec (float)), cela fera ce que vous attendez.

10

Demandez-vous pourquoi k et a apparaissent comme zéro? C'est parce que dans la division entière 2/3 = 0 (la partie fractionnaire est tronquée).

+0

S'étendant là-dessus, quand vous écrivez "a = ;" avec "a" float déclaré, seul le * result * de est lancé pour flotter. Comme toutes les valeurs et variables de vos expressions sont des nombres entiers, les résultats sont tous basés sur l'arithmétique des nombres entiers. – Steve314

+0

Cela vaut aussi pour un, car il fait la même opération là-bas (i/j == (int) 2/(int) 3 == 0) –

2

Si vous demandez pourquoi k et a sont 0: i/j*j est le même que (i/j)*j. Puisque j est plus grand que i, i/j est 0 (division entière). 0*j est toujours 0, donc le résultat (k) est 0. La même chose s'applique à la valeur de a.

3

cela est dû à la façon dont les compilateur traite c int dans les divisions:

#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

Vous ne l'avez pas dit ce que vous obtenez ou ce que vous attendez, mais dans ce cas, il est probablement facile à deviner. Lorsque vous faites 'a = i/j * j', vous vous attendez à ce que le résultat soit d'environ .2222 (c'est-à-dire 2/9), mais vous obtenez 0.0. C'est parce que i et j sont tous les deux int, donc la multiplication et la division (cruciale) sont faites en maths entiers, cédant 0. Vous assignez le résultat à un float, de sorte que 0 est alors converti en 0.0f.

Pour résoudre ce problème, convertir au moins un opérande à virgule flottante AVANT la division: a = (float)i/j*j);