当我尝试除以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)
我感谢您的帮助.
由于两个操作数都是整数,因此编译器执行整数除法(不计算小数部分).如果至少有一个操作数是浮点类型(如在其他示例中那样),则另一个操作数被提升并执行浮点除法.
修复
至少创建一个浮点类型(double或float)的操作数; 你可以做到这一点,例如:
double文字2(60是整数,60.0甚至60.是double,60.f是float)double(60),(double)60).就个人而言,我更喜欢直接使用double文字 - 而不是演员在中途正确的编译器上有任何性能损失,但它只是使用正确类型的文字感觉"错误"和冗长.(显然,当两个操作数都是变量而不是文字时,你必须使用强制转换)
常见的异议
"但我把它分配给了double!"
许多新手都被这个事实感到困惑,因为他们认为分配1的结果的double应该是某种暗示的编译器.事实上,事实并非如此.
在表达式中完成的计算/促销完全独立于目标的类型,这只是最后一步.子表达式的评估结果如何,不考虑结果的使用方式,因此所有类型的促销/操作仅取决于操作数的类型.
为什么会想要整数除法?
即使参数都是整数(例如VB6,IIRC),有几种语言会自动执行浮点除法,因为对初学者来说感觉更直观.这与C/C++中的情况不同:当参数为整数时,除法是积分的,因为在很多情况下你只是不关心小数,和/或出于性能原因而不使用FPU(背景哲学)在C和C++中,"你不为你不使用的东西买单".
显然,问题本可以使用单独的运算符进行积分除法(VB,再次使用\),但恕我直言,我们在C++中有足够的运算符.:)