【问题标题】:Why does C not truncate this?为什么C不截断这个?
【发布时间】:2021-10-30 15:21:34
【问题描述】:

我目前正在阅读关于 C 的 K&R 书籍,我目前正在编写温度转换器代码,这里说 cels = 5 * (fahr-32) / 9; 不是将它乘以 5/9,而是乘以 5,然后除以 9,因为它被截断,但我的代码没有截断它是我做错了什么还是这是现代 C 中的一个新特性?这是我的代码

#include <stdio.h>

int main(){
    int fahr, cels;
    int lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;
    fahr = lower;
    while (fahr <= upper) {
        cels = (fahr - 32) * 5/9;
        printf("%d\t%d\n", fahr, cels);
        fahr = fahr + step;
    }
}

编辑: 而不是cels = (fahr - 32) * 5/9; 我做了cels = 5/9 *(fahr - 32); 并且它截断了代码。为什么另一个起作用而另一个不起作用?

【问题讨论】:

  • 这会有帮助吗? “How to debug small programs”。
  • 我的程序有效,我只是不明白为什么 C 不再截断它了?这是现代 C 编译器的新特性吗?
  • 这本书的意思是你不能这样做:cels = 5/9 * (fahr - 32);原因是乘法和除法是从左到右计算的,所以5 * a / 9a * 5 / 9都做乘法首先,但5 / 9 * a 先除。
  • 是的,我只是这样做了,它会截断它,但是为什么它不在其他代码上这样做呢?
  • 当你说不截断时,你是什么意思?你的意思是你得到浮点输出? - 不可能的。使用"%d" 格式说明符进行整数除法和输出只能得到整数输出。

标签: c computer-science


【解决方案1】:

当您执行(fahr - 32) * 5/9 时,这与((fahr - 32) * 5)/9 相同,因为*/ 具有相同的优先级并且保持关联。但是当你使用5/9 *(fahr - 32) 时,这与(5/9) *(fahr - 32) 相同,原因相同。

在所有情况下,整数除法都会向 0 截断,所以重要的是你是乘以 then 除法(这给你“正确”的结果)还是除法 then mulitply(它总是给你 0 因为5/9 截断为 0)

【讨论】:

  • 谢谢!我现在明白了哈哈。您的解释清晰简洁:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多