看看这些程序:
#include<stdio.h>
int i; //C implementation works fine with this initialization of variable i
i=108;
int main()
{
printf("%d",i);
return 0;
}
在此代码(c ++版本)中,它会抛出错误:
"i"不命名类型 i=99;
#include<iostream>
using namespace std;
int i;
i=99;
int main()
{
cout<<i<<endl;
return 0;
}
现在我读到导致成功运行 C版本的是隐式 int,后来从 C99 版本中删除。
1:这是否阻碍了C++版本成功运行?
2:如果这个隐式 int是第一个代码背后的原因,那么为什么编译器不会抛出两次定义"i"的错误?
请指出我对这个概念的错误理解。
在 C 中,这在全局范围内
int i;
i = 42;
将第 2 行作为对第 1 行中定义的内容的重新定义。如果类型匹配,编译器接受它并将"两个i
"合并为一个。
在上面的例子中,类型确实匹配,因为隐式地将">使任何未知的东西成为int
"规则应用于i
的第二个定义。
例如,以下行将无法编译:
float f;
f = 42;
因为第 2f
将被视为int
,这与第 1f
的类型不匹配,这是一个float
。
不是 100% 确定C++,但我认为这种">让任何未知的东西成为int
"的规则根本不存在于C++中。因此,在全球范围内,像i = 42;
这样的东西是无效的,这与之前是否声明或定义过i
完全无关。
在文件中的此时,任何代码行都必须是声明;它不能是现有对象的赋值。
在 C 语言中,有一条规则,声明可以省略类型(默认为int
),因此您的行可以在该语言中解析为声明(以及带有初始化器的定义)。此外,由于 C 有暂定定义,因此允许使用这个"第二个"定义:
int i; // tentative definition
int i = 42; // "int" added automatically
这两个规则结合起来使代码在 C 中有效,C++ 都没有。因此,在C++中,i = 42
不是声明,您的代码无效。时期。