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

时间:2017-07-31 12:30:07

标签: c++ c type-conversion

请考虑以下代码:

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

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

有趣的是,当我明确地将编译器置于C11模式时,我发现fetchProducts(){ this.props.fetchProductsHomeFromAPI({city:'ABCD'}); } 为4.14。 C11标准有哪些规则会影响结果?

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

3 个答案:

答案 0 :(得分:129)

在C(和C ++)中,由于3.14f + 1float类型提升int属于float类型。

C中的

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

(在C ++ 11及更高版本中,int指示编译器推断出类型。auto将是sum,其值为float。编译为C + +98或C ++ 03可能仍然有效,但会生成有关C ++ 11扩展的警告。This is what clang does, for example。在C ++ 11中重新定义3.14f + 1表示C和C之间的另一个物质差异C ++。)

答案 1 :(得分:5)

这真的很简单。

在旧版本的C(C99之前)中,您可以编写类似

的内容
auto n = 3;

n将是int类型,其值为3.您也可以写

auto n = 3.14f;

n int类型,值为3.

这被称为 implicit int 和K& R让它很有名。

所以你能看到

auto sum = d + i;

仅将float类型d + i分配给sum,这是一个隐含的int

因此答案4。

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

答案 2 :(得分:2)

在某些编译器中,扩展名为.c的文件编译为C,而不是C ++。

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

编译为:

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

在C语言中,auto是用于指定存储持续时间的关键字。创建auto变量时,它具有“自动存储持续时间”。我们将这些对象称为“局部变量”。在C中,函数中的所有变量都是默认的本地变量。这就是关键字auto几乎从未使用过的原因。

{C}语言中auto关键字无用。它存在,因为在C语言之前存在一种B语言,其中该关键字是声明局部变量所必需的。 (B被发展为NB,后来成为C.)