为什么在C和C之间初始化全局变量存在这种差异?
发布时间:2020-12-16 10:06:24 所属栏目:百科 来源:网络整理
导读:看看这些程序: #includestdio.hint i; //C implementation works fine with this initialization of variable ii=108;int main(){ printf("%d",i); return 0;} 在此代码(c版本)中,它会抛出错误: ‘i’ does not name a type i=99; #includeiostreamusing n
看看这些程序:
#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版本)中,它会抛出错误:
#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; 将第二行作为对第一行中定义的内容的重新定义.如果类型匹配,则编译器接受它并将“two is”合并为一个. 在上面的例子中,类型确实匹配,因为隐式地将“make anything unknown an int”规则应用于i的第二个定义. 例如,以下行将无法编译: float f; f = 42; 因为第二个f将被视为一个int,它与第一个f的类型不匹配,这是一个浮点数. 关于C不是100%肯定,但我认为这个“使任何未知的东西”在C中根本就不存在.所以在全球范围内,像i = 42;不会有效,这完全独立于i之前是否已被声明或定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |