假设我们有double f;
f+=1
和f+=1.0
之间有什么区别吗?
编译器如何处理这些情况?
我试过我的电脑并循环10次 10次次,经过的时间几乎相同
答案 0 :(得分:3)
这里参考c ++ 03。
4.9浮动积分转换[conv.fpint]
整数类型或枚举类型的右值可以是 转换为浮点类型的右值。结果是准确的 如果可能的话。否则,它是实现定义的选择 要么是下一个更高或更高的可表示值。
如果您的系统可以完全表示1.0(并且看起来可以),那么表达式是相同的。
答案 1 :(得分:2)
在任何自尊的编译器中没有区别,隐式转换肯定会在编译时执行,甚至可能在禁用优化的情况下执行。如果您有疑问,可以随时检查生成的装配。
现在,从风格上讲,我更喜欢永远保持"正确"的常量。类型(特别是在某些术语可能会在以后更改为int的表达式中),尽管有些人认为所有尾随.0
只会添加视觉混乱(但是:你可以避免尾随0
而只是离开点以指定双字面值 - 如1.
中所示。
答案 2 :(得分:0)
非优化构建可能会略有不同:整数常量1可以(应该?)在运行时而不是编译时提升为double。
答案 3 :(得分:0)
您的系统始终可以check:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
double f(0.);
cout << std::is_same<decltype(f+1), decltype(f+1.)>::value << endl;
return 0;
}
如果有人发现他们不同的情况,我很感激评论