2

当我遇到以下问题时,我正在用 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)的代码返回零?

4

6 回答 6

11

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

于 2009-10-14T19:10:21.717 回答
7

我认为您正在经历的是整数算术。您正确地假设landb是 2,但错误地假设kanda将是 3,因为它是相同的操作。但它不是,它是整数算术(而不是浮点算术)。因此,当您这样做时i / j(请考虑使用一些空格),2 / 3 = 0.33333...被转换为 anint并因此变为 0。然后我们再次乘以 3,并且 0 * 3 = 0。

如果你改变ij成为floats (或在你的数学中添加(float)强制转换),这将达到你的预期。

于 2009-10-14T19:13:06.180 回答
5

你还没有说你得到了什么或你期望什么,但在这种情况下,它可能很容易猜到。当您执行 'a=i/j*j' 时,您期望结果大约为 0.2222(即 2/9),但实际上您得到的是 0.0。这是因为 i 和 j 都是 int,所以乘法和(至关重要的)除法是在整数数学中完成的,产生 0。您将结果分配给浮点数,这样 0 就会转换为 0.0f。

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

于 2009-10-14T19:11:19.343 回答
4

这是由于 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;
}
于 2009-10-14T19:11:07.567 回答
3

如果你问为什么 k 和 a 是 0:i/j*j(i/j)*j. 由于 j 大于 i,i/j因此为 0(整数除法)。0*j仍为 0,因此结果 (k) 为 0。同样适用于 a 的值。

于 2009-10-14T19:11:03.293 回答
0

变量是否浮动都没有关系,只要您使用

整数 / 整数,你会得到 0,

但是因为您使用的是浮点输出,所以您得到 0.0

于 2018-10-04T07:53:08.140 回答