作用域


//变量的定义,赋值,初始化的区别:
#include <stdio.h>
main(){
int a;//此为变量的定义
a = 3;//此为变量的赋值
int b=3;//此为通常说的变量的定义并初始化
int c;
printf ("%d",c);//事实上,如果变量在定义的时候没有初始化,一般情况下变量会被c编译器自动初始化为0
}

2.作用域:

//1
#include <stdio.h>
void b(int c,int d){
int c;
int d=3;
printf ("%d %d",c,d);
}
void main(void){
b(4,5);
}
/*以上代码,函数体内的c和d均是语法错误,
报错原因都是重复定义。
我们在定义函数的时候,括号内的形参已经被
定义为函数b的局部变量了,就不能在函数体内的最外层再次定义了*/

/*下面是正确的写法*/
#include <stdio.h>
void b(int c,int d){
d=3;
printf ("%d %d",c,d);
}
void main(void){
b(4,5);//将打印4,3
}

 3.

#include <stdio.h>

void main (void){
int a;
float a;//报错,变量a类型冲突,不同于Python,一旦变量a类型定义了就不能更改
}

 4 定义在程序文件最外层的声明以及定义:

/*在程序文件最外层,如果是形如 int a;或者 static int b;这就是声明
声明的目的就是来声明变量
到底是全局变量还是被static修饰的静态变量,
int a;这样的形式,则声明int变量a为全局变量
static int b;这样的形式,则声明int变量b为静态变量,static表示任何其他程序文件都无法获取到这个变量在源程序文件中的值,同时对该变量的更改也将不影响原程序文件
同一声明在程序文件中可以出现多次,即 int a; int a; int a;//这样是没有语法错误的。 但是,像以下这样的代码 int a; static int a;//这就报错了,第一句话已经说明int a是全局变量,而第二句话又说是static变量,显然前后矛盾了 而在程序文件最外层,形如这样的 int a=2;或者static int b = 3, 这就是声明并定义了,因为变量不能重复定义,所以以下代码会报错: static int a = 2; static int a = 3; 同一声明可以出现多次,所以,以下代码是合法的: static int a; static int a=2; 声明前后矛盾同样会报错,所以以下也是非法的: int a; static int a =3;//
*/ #include <stdio.h> int a; int a;//合法 int b; static int b;//非法int d=3; int d = 3;//非法 int f; int f=2;//合法 void func1(void); static void func2(void); void main(void){ int i; int i;//报错,这里要特别注意了,不同于原文件最外层,这样的形式在函数体内都是定义,这里显然重复定义了 } static void func1(void){ printf ("func1"); } //报错,前面已经声明了func1是全局函数,这里定义 //的时候却说是static函数,这就矛盾了 void func2(void){ printf ("func2"); }//不报错,func2仍然是static函数,注意如果换成变量的话就会报错
原文地址:https://www.cnblogs.com/saolv/p/9609734.html