当我遇到以下问题时,我正在用 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
)的代码返回零?
当我遇到以下问题时,我正在用 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
)的代码返回零?
您是在问为什么 k 和 a 显示为零?这是因为在整数除法中 2/3 = 0(小数部分被截断)。
我认为您正在经历的是整数算术。您正确地假设l
andb
是 2,但错误地假设k
anda
将是 3,因为它是相同的操作。但它不是,它是整数算术(而不是浮点算术)。因此,当您这样做时i / j
(请考虑使用一些空格),2 / 3 = 0.33333...被转换为 anint
并因此变为 0。然后我们再次乘以 3,并且 0 * 3 = 0。
如果你改变i
并j
成为float
s (或在你的数学中添加(float)
强制转换),这将达到你的预期。
你还没有说你得到了什么或你期望什么,但在这种情况下,它可能很容易猜到。当您执行 'a=i/j*j' 时,您期望结果大约为 0.2222(即 2/9),但实际上您得到的是 0.0。这是因为 i 和 j 都是 int,所以乘法和(至关重要的)除法是在整数数学中完成的,产生 0。您将结果分配给浮点数,这样 0 就会转换为 0.0f。
要修复它,请在除法之前将至少一个操作数转换为浮点数:a = (float)i/j*j);
这是由于 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;
}
如果你问为什么 k 和 a 是 0:i/j*j
和(i/j)*j
. 由于 j 大于 i,i/j
因此为 0(整数除法)。0*j
仍为 0,因此结果 (k) 为 0。同样适用于 a 的值。
变量是否浮动都没有关系,只要您使用
整数 / 整数,你会得到 0,
但是因为您使用的是浮点输出,所以您得到 0.0