全局变量不会带来新的价值

时间:2014-07-25 11:59:30

标签: c

我正在制作一个简单的C程序

#include<stdio.h>
static int a;
a = 5;
int main()
{
printf("%d",a);
return 0;
}

编译器错误:“非静态声明'a'遵循静态声明”

这个错误是什么意思?

7 个答案:

答案 0 :(得分:11)

  

此错误日志的含义是什么?

这有点棘手:看起来像是作业

a = 5;

被视为

int a = 5;

由于旧的C规则允许您声明int变量和int返回函数而未明确指定其类型(在C的现代版本中这绝对不是一个好主意)。

请注意,仅在函数体外的范围内将此视为具有隐式int的声明。

您可以通过将声明与初始化相结合来修复它,如下所示:

static int a = 5;

答案 1 :(得分:3)

在函数外部,您只能声明变量,不能有实际的代码语句。

a = 5;

被解释为另一个声明,我的意图是编写一些代码。

而是同时声明和初始化

 static int a = 5;

答案 2 :(得分:1)

您对a的第一次声明是statica有内部联系)。

第二个声明不是statica有外部链接)。是的,在这种情况下,a = 5;是隐式类型int的声明。

两人都不同意。

顺便说一下。对于功能,这将是o.k.因为第二个声明将“继承”内部联系。

答案 3 :(得分:1)

我们无法全局编写任何赋值语句。例如:

#include <stdio.h>
static int i=10;   //Initialization statement
i=25;              //Assignment statement
int main(){
    printf("%d",i);
    return 0;
}

Output: Compilation error

注意:在variable时为declaration分配任何值都称为initialization,同时为变量分配任何值而不是在声明时{{1} }。

答案 4 :(得分:0)

您无法像在a = 5;之前那样设置值:main(...)。请参阅以下代码:

static int a = 1; //default = 0;

int main()
{
    printf("a = %d\n", a);

    a = 2;

    printf("a = %d\n", a);

    return 0;
}

输出:

a = 1
a = 2

答案 5 :(得分:0)

A = 5被认为是尝试创建另一个名为a的变量。你应该在静态int之后放置= 5。

Static int a = 5;

答案 6 :(得分:0)

只需对代码进行一些修改即可帮助您理解它。

#include<stdio.h>
//static int a;   //comment this statement
a = 5;
int main()
{
printf("%d",a);
return 0;
}

现在编译此代码[请启用编译器的警告]

然后你会收到类似这样的警告 数据定义没有类型或存储类[默认启用]

所以现在尝试理解这个警告,这意味着编译器将语句a=5视为定义,但没有数据类型。但编译器无法使用int的默认数据类型。

所以这个陈述相当于

int a=5;