考虑以下代码:
float d = 3.14f;
int i = 1;
auto sum = d + i;
根据 cppreference.com , i
时应转换为 float
d
。但是,当我实际运行代码时,我发现 sum
是4。为什么会出现这种情况?
有趣的是,当我明确地将编译器置于 C11 模式时,我发现 sum
是 4.14。 C11 标准更改了哪些规则会影响结果?
如果我使用 C++ 编译器编译相同的代码会发生什么?
原文由 jfxu 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C(和 C++)中,
3.14f + 1
是float
类型,因为int
到float
的 _类型提升_。但是 在 C 中,直到并包括 C90,并且这样的标准很可能是您的 C 编译器默认值,这被分配给
int
类型,产生 4,因为int
是具有自动存储持续时间的变量的默认类型。从 C99 开始,编译将失败,因为隐式 int 被撤回,尽管编译器可能仍然允许它,并发出警告。(In C++11 and later,
auto
instructs the compiler to deduce the type.sum
will be afloat
with value3.14f + 1
. 编译为 C++98 或 C++03 可能仍然有效,但会生成有关 C++11 扩展的警告。 例如,这就是 clang 所做的。在 C 中重新定义auto
++11 代表了 C 和 C++ 之间的另一个实质性分歧。)