为什么int和float的总和是int?

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由于类型类型提升intfloat.

但是在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++之间的另一种物质差异.)

  • 当然,*implicit int*只是最古老的C标准的一部分,所以代码只能为C*最好定义*C90和C++*从*C++ 11开始,所以我会说答案是正确的,但你不能确定使用其他标准的编译器是什么构成的. (3认同)
  • 评论不适用于扩展讨论; 这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/150634/discussion-on-answer-by-bathsheba-why-is-the-sum-of-an-int-and-一个浮子-AN-INT). (2认同)
  • 那是因为代码在C99和C11,@ Peter中实际上是格式错误的.GCC和Clang默认与C89/C90兼容,其中`sum`是一个`int`,因为隐式int规则,这就是你在反汇编中观察到的.如果查看输出,您会看到它们确实发出了诊断信息(尽管它只是一个警告)."double"与"float"没有任何变化.正如前面提到的那样,有关于此的讨论,参考了标准文本,但它在一堆噪音中丢失了,并被转移到聊天中.人们说这个问题没有错! (2认同)

P45*_*ent 5

这真的很简单.

在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 + isum这是一个隐式int.

因此答案4.

在较新版本的C(C99以后版本)中,隐式int被删除.

  • 换句话说,在 C 中,`auto n = 3.14f` 只是`auto int n = 3.14f` 的简写。有人不得不明确地说出来。 (3认同)