C++中double变量两种初始化写法的实际差异是什么?
结论
这两种写法在主流32位int、64位double的编译环境下,运行时没有可观测的差异,但从语法规则和编码规范角度存在明确区别。
具体差异说明
- 写法1:
double num {5.0};
右侧的5.0本身就是double类型的字面量,属于同类型直接初始化,不存在任何类型转换,完全符合列表初始化的安全校验规则,不会触发任何编译告警。 - 写法2:
double num {5};
右侧的5是int类型的字面量,初始化时会触发int到double的隐式类型转换。在常规场景下,32位int的所有整数值都可以被64位double精确表示,这个转换是无损的,因此列表初始化不会判定为窄化错误,你在VS2019上测试二者表现一致是正常现象。
如果你的运行环境使用64位int,当整数值超过double可以精确表示的整数范围(大于2^53)时,用整型字面量初始化double会出现隐式精度损失,部分严格的编译器会针对这类场景抛出窄化转换警告,而使用对应取值的double字面量就不会出现这类问题。
为什么learncpp推荐使用5.0的写法
这一建议主要出于编码规范层面的考量:
- 显式标明字面量类型,代码可读性更强,其他开发者一眼就能确认这里使用的是浮点类型字面量,不需要额外做类型推导
- 避免不必要的隐式转换,降低后续代码迭代出错的概率。比如后续你要把变量类型修改为
float时,double num {5.0}只要对应改为float num {5.0f}即可,而如果原来用的是整型字面量5,很容易忽略浮点字面量后缀的问题,触发不必要的编译告警甚至精度损失。
内容的提问来源于stack exchange,提问作者user14793744
相关产品推荐
相关产品推荐

