加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么在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版本)中,它会抛出错误:

‘i’ does not name a type
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;

将第二行作为对第一行中定义的内容的重新定义.如果类型匹配,则编译器接受它并将“two is”合并为一个.

在上面的例子中,类型确实匹配,因为隐式地将“make anything unknown an int”规则应用于i的第二个定义.

例如,以下行将无法编译:

float f;
f = 42;

因为第二个f将被视为一个int,它与第一个f的类型不匹配,这是一个浮点数.

关于C不是100%肯定,但我认为这个“使任何未知的东西”在C中根本就不存在.所以在全球范围内,像i = 42;不会有效,这完全独立于i之前是否已被声明或定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读