请考虑以下代码:
float d = 3.14f;
int i = 1;
auto sum = d + i;
根据cppreference.com,i
在float
添加到d
时应转换为sum
。但是,当我实际运行代码时,我发现sum
是4.为什么会发生这种情况?
有趣的是,当我明确地将编译器置于C11模式时,我发现fetchProducts(){
this.props.fetchProductsHomeFromAPI({city:'ABCD'});
}
为4.14。 C11标准有哪些规则会影响结果?
如果我使用C ++编译器编译相同的代码会发生什么?
答案 0 :(得分:129)
在C(和C ++)中,由于3.14f + 1
到float
的类型提升,int
属于float
类型。
但,直到并包括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.)