C 为什么这个除法的结果是零?
我在用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;
#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)