gpt4 book ai didi

C++。 1 除以任何数得到 0

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:05 32 4
gpt4 key购买 nike

当我尝试除以 1/60 或 1/(60*60) 时,结果为 0。即使在调试器窗口中也是如此。我有点困惑它可能是什么,因为 2/3 或 2.5/6 给出了结果。

我的代码:

int main()
{
double k1 = 1/60;
cout << k1
<< endl;
double k2 = 1/(60*60);
cout << k2
<< endl;

return 0;
}

感谢您的帮助。

最佳答案

由于您的两个操作数都是整数,因此编译器执行整数除法(不计算小数部分)。如果至少一个操作数是浮点类型(如在您的其他示例中),则另一个操作数将被提升并执行浮点除法。

修复

使至少一个浮点类型的操作数(doublefloat);你可以这样做,例如:

  • 将其设为double 字面值2(60 为整数,60.0 甚至60。 double60.ffloat)
  • 使用强制转换(double(60)(double)60)。

就我个人而言,我更喜欢直接使用 double 文字 - 并不是说​​强制转换对半途而废的编译器有任何性能损失,但就仅使用正确类型的文字而言感觉“错误”和冗长. (显然,当两个操作数都是变量而不是文字时,您必须使用强制转换)

常见反对意见

  • “但我将它分配给一个double!”

    许多新手对这个事实感到困惑,因为他们认为将1 结果赋值给double 应该是对编译器的某种提示。事实上,它不是。

    对表达式进行的计算/提升完全独立与目标类型无关,这只是最后一步。子表达式的计算结果与结果的使用方式无关,因此所有类型提升/操作仅取决于操作数的类型。

  • 为什么要整数除法?

    即使参数都是整数(例如 VB6、IIRC),一些语言也会自动执行浮点除法,因为这对新手来说更直观。这与 C/C++ 中的不同:当参数为整数时,除法是整数,因为在许多情况下,您根本不关心小数,和/或出于性能原因,最好不要使用 FPU(背景哲学在 C 和 C++ 中是“你不用为你不用的东西付费”)。

    显然,这个问题可以通过使用单独的整数除法运算符来解决(VB 同样使用 \),但是恕我直言,我们在 C++ 中有足够的运算符。 :)


  1. 吹毛求疵的角落:是的,这里实际上是初始化,而不是赋值,但我们在谈论同样的误解。
  2. “文字”是包含在源代码中的值。

关于C++。 1 除以任何数得到 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163964/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com