为什么是一个整数和一个浮点数的整数?

考虑下面的代码:

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

据cppreference.com , i应该被转换为float时,它被添加到d 。 但是,当我真正运行代码时,我发现sum是4.为什么会发生这种情况?

有趣的是,当我明确地把我的编译器变成C11模式时,我发现sum是4.14。 C11标准的哪些改变会影响结果?

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

在C(和C ++)中, 3.14f + 1是一个floattypes,由于int types的提升float

在C中,直到并包括C90,这样的标准很可能是你的C编译器默认的,这被分配给一个inttypes,产生4,因为int是具有自动存储持续时间的variables的默认types。 从C99开始,编译将会失败,因为隐式的int被撤销,尽pipe编译器可能仍然允许它,并带有警告。

(在C ++ 11和更高版本中, auto指示编译器推断types, sum将是一个值为3.14f + 1float ,编译为C ++ 98或C ++ 03可能仍然有效,但会生成警告C ++ 11的扩展, 这就是clang所做的,例如 ,在C ++ 11中重新定义auto代表了C和C ++之间的另一个材料差异。

这真的很简单。

在C的旧版本(在C99之前),你可以写类似的东西

 auto n = 3; 

n将是一个int值,值为3.你也可以写

 auto n = 3.14f; 

n 仍然是一个int型,值为3。

这被称为隐式int ,K&R使它非常有名。

所以你可以看到

 auto sum = d + i; 

只是将floattypesd + i赋值为一个隐式的int

因此答案4。

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

在某些编译器中,具有.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是用于指定存储持续时间的关键字。 当你创build一个autovariables时,它有一个“自动存储时间”。 我们称这些对象为“局部variables”。 在C中,函数中的所有variables都是默认的本地variables。 这就是为什么关键字auto很less使用。

auto关键字在C语言中是无用的。 它在那里,因为在C语言之前,存在一个B语言,其中该关键字是声明局部variables所必需的。 (B被开发成NB,成为C)