Pregunta

estaba escribiendo este código en C, cuando me encontré con el siguiente problema.

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

Puede alguien decirme por qué el código se vuelve cero para el primer y tercer variables (k y a)?

¿Fue útil?

Solución

Lo que creo que está experimentando es aritmética de enteros . Supones correctamente l y b a ser 2, pero incorrectamente suponer que k y a será de 3, porque es la misma operación. Pero no lo es, es la aritmética de enteros (en lugar de aritmética de punto flotante). Así que cuando lo hace i / j (por favor, considere el uso de algunos espacios en blanco), 2/3 = 0.33333 ... , que se convierte en una int y por lo tanto se convierte en 0. Luego multiplicamos por 3 otra vez, y 0 * 3 = 0.

Si cambia i y j ser floats (o pimienta de matemáticas con su lanza (float)), esto va a hacer lo que usted espera.

Otros consejos

¿Usted está preguntando por qué k y un espectáculo como cero? Esto es porque en la división de enteros 2/3 = 0 (la parte fraccionaria se trunca).

Usted no ha dicho lo que está recibiendo o lo que se espera, pero en este caso es probable que sea fácil de adivinar. Cuando lo haga 'a = i / j * j', se está esperando que el resultado sea más o menos 0,2222 (es decir, 2/9), pero en lugar de que está recibiendo 0.0. Esto se debe a i y j son ambos de la INT, por lo que la multiplicación y la división (crucialmente) se realizan en matemáticas número entero, produciendo 0. Se asigna el resultado a un flotador, de manera que 0 se convierte después en 0.0f.

Para solucionarlo, convertir al menos un operando de punto flotante antes de la división: a = (float)i/j*j);

Esto es debido a cómo los compilador trata Cint en las divisiones:

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

Si usted está preguntando por qué k y a son 0: i/j*j es la misma que (i/j)*j. Desde j es mayor que i, i/j es 0 (división entera). 0*j todavía es 0, por lo que el resultado (k) es 0. Lo mismo se aplica al valor de a.

no importa si usted es variable es flotante o no, siempre que estés utilizando

número entero / entero, obtendrá 0,

sino porque está utilizando una salida de flotación, se obtiene 0.0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top