Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个除法的结果是零?_C_Division_Integer Division - Fatal编程技术网

C 为什么这个除法的结果是零?

C 为什么这个除法的结果是零?,c,division,integer-division,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; } #包括 int main() { int i=2; int j=3; int k,l;

我在用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;
}
#包括
int main()
{
int i=2;
int j=3;
int k,l;
浮子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);
返回0;
}

有人能告诉我为什么第一个和第三个变量(
k
a
)的代码返回零吗?

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

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

这是由于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;
}
#包括
int main()
{
int i=2;
int j=3;
int k,l;
浮子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;//与k相同
b=j/i*i;//与b相同
printf(“%d%d%f%f/n”,k、l、a、b);
返回0;
}

你没有说你得到了什么或你期望得到什么,但在这种情况下,很容易猜测。当你做'a=i/j*j'时,你期望的结果大约是.2222(即2/9),但是你得到的是0.0。这是因为i和j都是int,所以乘法和(关键的)除法是在整数数学中完成的,得到0。将结果指定给浮点,以便将0转换为0.0f


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

我认为您正在经历的是整数算术。您正确地假设
l
b
为2,但错误地假设
k
a
为3,因为这是相同的操作。但它不是,它是整数算术(而不是浮点算术)。因此,当你执行<代码> I/J < /代码>时(请考虑使用一些空白),2/3 = 0,33333…将其转换为
int
,从而变为0。然后我们再乘以3,0*3=0


如果您将
i
j
更改为
float
s(或在数学中添加
(float)
casts),这将满足您的期望。

只要您使用

整数/整数,您将得到0


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

您得到了什么错误?您希望输出是什么?您得到的是什么输出?请注意,您得到的是/n而不是\n。这是您代码的复制粘贴,还是您重新键入了它?最好是复制粘贴,以避免抄写错误。我已将标题/问题更改为我认为的内容intended@therefromhere:你只是猜测和“修正”问题,并不能帮助提问者学会如何提出更好的问题。(我承认这是一个非常极端的编辑,但这是一个非常常见的初学者错误,我认为值得一试)当你用“a=;”来写“a”时,进一步扩展声明为float时,它只是被强制转换为float的结果。因为表达式中的所有值和变量都是整数,所以结果都基于整数算术。这也适用于a,因为他在那里执行相同的操作(i/j==(int)2/(int)3==0)