1

我试图找到在 C 中以恒定速度移动输入距离所花费的时间。我有功能但输出打印为 0 的代码?知道出了什么问题吗?

#include <stdio.h>
#include <stdlib.h>
int main() {
    int distance, speed = 80;
    float time;

    // This is how to read an int value
    printf("Please enter a distance in kilometers to be covered at 80KPH. \n");
    scanf("%d", & distance);
    printf("You typed: %d\n", distance);
    printf("\n");
    time = distance / speed;
    printf("It will take you %.2f to cover ", time);
}
4

3 回答 3

8

因为这两个操作数都是整数,所以编译器会生成整数除法的代码。但是你想要真正的分裂。因此,将一个或多个操作数转换为浮点类型,编译器将发出实际除法的代码。

time = (float) distance / time;

整数除法是你在小学学到的。因此,例如,11/3 是 3 余数 2。在 C 中,表达式 11/3 的计算结果为 3。这是整数除法。在您的情况下,分子(距离)似乎小于分母(时间),因此表达式

distance / time

评估为 0。

这是由除法运算符重载引起的常见混淆。如果两个操作数都是整数,则此运算符表示整数除法,否则为实数除法。

要学习的关键点是操作数的类型决定了使用整数除法还是实数除法。存储结果的变量类型对此选择没有影响。

于 2013-10-27T21:28:34.140 回答
3

改变

time = distance / speed;

time = (float) distance / speed;

您正在执行整数除法而不是浮点除法。

于 2013-10-27T21:26:42.977 回答
0

根据其他人所说的更改代码后(首先转换为 float 或 double),您还需要将格式说明符从“%d”更改为“%f”以显示浮点数(无论是 float 还是 double ),否则您将在输出中看到垃圾。

编辑:很抱歉混淆了这个。我正在考虑将速度和距离定义为 float 而不是 int 的修复方法。在这种情况下,您可以简单地将“int”转换为“float”,将“%d”转换为“%f”(可能带有精度和/或舍入标志)。但是,这将改变程序的工作方式(因为用户现在可以输入非整数值),因此它可能不是您想要的。

于 2013-10-27T21:34:28.577 回答