当我遇到以下问题时,我在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;
}
有谁可以告诉我为什么代码为第一个和第三个变量(k
和a
)返回零?
答案 0 :(得分:11)
你问为什么k和a显示为零?这是因为在整数除法中2/3 = 0(小数部分被截断)。
答案 1 :(得分:7)
我认为您遇到的是整数算术。您正确地认为l
和b
为2,但错误地认为k
和a
将为3,因为它是相同的操作。但事实并非如此,它是整数运算(而不是浮点运算)。所以,当你i / j
(请考虑使用一些空格)时,2/3 = 0.33333 ... 会被投射到int
,从而变为0.然后我们相乘再次增加3,并且0 * 3 = 0。
如果您将i
和j
更改为float
s(或使用(float)
强制转换您的数学运算),这将符合您的预期。
答案 2 :(得分:5)
你还没有说出你得到的或你期望的东西,但在这种情况下,它可能很容易猜到。当你做'a = i / j * j'时,你期望结果大致为.2222(即2/9),但你得到0.0。这是因为i和j都是int,所以乘法和(关键)除法是在整数数学中完成的,得到0.你将结果赋值给float,然后将0转换为0.0f。
要解决此问题,请在除法之前将至少一个操作数转换为浮点数:a = (float)i/j*j);
答案 3 :(得分:4)
这是由于c编译器如何处理div中的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 :(得分:3)
如果您问为什么k和a为0:i/j*j
与(i/j)*j
相同。由于j大于i,i/j
为0(整数除法)。 0*j
仍为0,因此结果(k)为0.这同样适用于a的值。
答案 5 :(得分:0)
只要使用
,变量是否为float都无关紧要整数/整数,您将得到0,
但是由于您使用的是浮点输出,因此您会得到0.0