为什么是一个整数和一个浮点数的整数?
考虑下面的代码:
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
是一个float
types,由于int
types的提升为float
。
但在C中,直到并包括C90,这样的标准很可能是你的C编译器默认的,这被分配给一个int
types,产生4,因为int
是具有自动存储持续时间的variables的默认types。 从C99开始,编译将会失败,因为隐式的int被撤销,尽pipe编译器可能仍然允许它,并带有警告。
(在C ++ 11和更高版本中, auto
指示编译器推断types, sum
将是一个值为3.14f + 1
的float
,编译为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;
只是将float
typesd + 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一个auto
variables时,它有一个“自动存储时间”。 我们称这些对象为“局部variables”。 在C中,函数中的所有variables都是默认的本地variables。 这就是为什么关键字auto
很less使用。
auto
关键字在C语言中是无用的。 它在那里,因为在C语言之前,存在一个B语言,其中该关键字是声明局部variables所必需的。 (B被开发成NB,成为C)