jfx*_*fxu 45 c c++ type-conversion
请考虑以下代码:
float d = 3.14f;
int i = 1;
auto sum = d + i;
Run Code Online (Sandbox Code Playgroud)
根据cppreference.com,i应该在float添加时转换为d.但是,当我实际运行代码时,我发现它sum是4.为什么会发生这种情况?
有趣的是,当我明确地将我的编译器放入C11模式时,我发现它sum是4.14.C11标准有哪些规则会影响结果?
如果我使用C++编译器编译相同的代码会发生什么?
Bat*_*eba 129
在C(和C++),3.14f + 1是一个float由于类型类型提升的int到float.
但是在C中,直到并包括C90,这样的标准很可能是你的C编译器默认值,这被分配给一个int类型,产生4,因为它int是具有自动存储持续时间的变量的默认类型.从C99开始,编译将失败,因为隐式int被撤销,尽管编译器可能仍然允许它,并发出警告.
(在C++ 11以后,auto指示编译器推断出的类型.sum将是一个float具有值3.14f + 1.编译为C++ 98或C++ 03可能仍然工作,但产生一个警告约C++ 11个扩展. 这正如clang所做的那样.这auto在C++ 11中的重新定义代表了C和C++之间的另一种物质差异.)
这真的很简单.
在C的旧版本中(在C99之前),您可以编写类似的内容
auto n = 3;
Run Code Online (Sandbox Code Playgroud)
并且n是一个int值为3 的类型.你也可以写
auto n = 3.14f;
Run Code Online (Sandbox Code Playgroud)
和n将仍然是一个int类型,具有值3.
这被称为隐式int,K&R使它非常有名.
你能看到吗?
auto sum = d + i;
Run Code Online (Sandbox Code Playgroud)
仅分配float类型d + i来sum这是一个隐式int.
因此答案4.
在较新版本的C(C99以后版本)中,隐式int被删除.