为什么这个除法导致零?

san*_*101 2 c division integer-division

当我遇到以下问题时,我在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;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么代码为第一个和第三个变量(ka)返回零?

bob*_*mcr 11

你问为什么k和a显示为零?这是因为在整数除法中2/3 = 0(小数部分被截断).


Chr*_*utz 7

我认为你正在经历的是整数运算.你正确地假设l并且b是2,但错误地认为k并且a将是3,因为它是相同的操作.但事实并非如此,它是整数运算(而不是浮点运算).所以当你这样做时i / j(请考虑使用一些空格),2/3 = 0.33333 ... 被投射到aint并因此变为0.然后我们再次乘以3,并且0*3 = 0.

如果你改变ij成为floats(或者用(float)演员表示你的数学胡椒),这将做你期望的.


Jer*_*fin 5

你还没有说出你得到的或你期望的东西,但在这种情况下,它可能很容易猜到.当你做'a = i/j*j'时,你期望结果大致为.2222(即2/9),但你得到0.0.这是因为i和j都是int,所以乘法和(关键)除法是在整数数学中完成的,产生0.你将结果赋值给float,然后将0转换为0.0f.

要解决此问题,请在除法之前将至少一个操作数转换为浮点数: a = (float)i/j*j);