C++.将1除以任何数字得到0

Vla*_*tai 5 c++ division

当我尝试除以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;
}
Run Code Online (Sandbox Code Playgroud)

我感谢您的帮助.

Mat*_*lia 9

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

修复

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

  • 使它成为double文字2(60是整数,60.0甚至60.double,60.ffloat)
  • 使用强制转换(double(60),(double)60).

就个人而言,我更喜欢直接使用double文字 - 而不是演员在中途正确的编译器上有任何性能损失,但它只是使用正确类型的文字感觉"错误"和冗长.(显然,当两个操作数都是变量而不是文字时,你必须使用强制转换)

常见的异议

  • "但我把它分配给了double!"

    许多新手都被这个事实感到困惑,因为他们认为分配1的结果的double应该是某种暗示的编译器.事实上,事实并非如此.

    在表达式中完成的计算/促销完全独立于目标的类型,这只是最后一步.子表达式的评估结果如何,不考虑结果的使用方式,因此所有类型的促销/操作仅取决于操作数的类型.

  • 为什么会想要整数除法?

    即使参数都是整数(例如VB6,IIRC),有几种语言会自动执行浮点除法,因为对初学者来说感觉更直观.这与C/C++中的情况不同:当参数为整数时,除法是积分的,因为在很多情况下你只是不关心小数,和/或出于性能原因而不使用FPU(背景哲学)在C和C++中,"你不为你不使用的东西买单".

    显然,问题本可以使用单独的运算符进行积分除法(VB,再次使用\),但恕我直言,我们在C++中有足够的运算符.:)


  1. Nitpickers的角落:是的,这里实际上它是一个初始化,而不是一个任务,但我们正在讨论同样的错误观念.
  2. "文字"是源代码中包含的值.