为什么int和float之和是int?

新手上路,请多包涵

考虑以下代码:

 float d  = 3.14f;
int   i  = 1;
auto sum = d + i;

根据 cppreference.comi 时应转换为 float d 。但是,当我实际运行代码时,我发现 sum 是4。为什么会出现这种情况?

有趣的是,当我明确地将编译器置于 C11 模式时,我发现 sum 是 4.14。 C11 标准更改了哪些规则会影响结果?

如果我使用 C++ 编译器编译相同的代码会发生什么?

原文由 jfxu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 638
1 个回答

在 C(和 C++)中, 3.14f + 1float 类型,因为 intfloat 的 _类型提升_。

但是 在 C 中,直到并包括 C90,并且这样的标准很可能是您的 C 编译器默认值,这被分配给 int 类型,产生 4,因为 int 是具有自动存储持续时间的变量的默认类型。从 C99 开始,编译将失败,因为隐式 int 被撤回,尽管编译器可能仍然允许它,并发出警告。

(In C++11 and later, auto instructs the compiler to deduce the type. sum will be a float with value 3.14f + 1 . 编译为 C++98 或 C++03 可能仍然有效,但会生成有关 C++11 扩展的警告。 例如,这就是 clang 所做的。在 C 中重新定义 auto ++11 代表了 C 和 C++ 之间的另一个实质性分歧。)

原文由 Bathsheba 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题