局部变量:
#include<stdio.h>
int main()
{
int i=333;
printf("before i=%d\n",i);
for(int i=0;i<10;i++)
{
printf("i=%d\n",i);
}
printf("after i=%d\n",i);
return 0;
}
运行结果:
#include<stdio.h>
int main()
{
int i=333;
printf("before i=%d\n",i);
for(i=0;i<10;i++)
{
printf("i=%d\n",i);
}
printf("after i=%d\n",i);
return 0;
}
运行结果:
全局变量:
如果不对全局变量进行初始化,那么它会自动初始化为0。如:
#include<stdio.h>
int count;
void a()
{
count++;
}
void b()
{
count++;
}
void c()
{
count++;
}
int main()
{
a();
b();
c();
printf("count=%d\n",count);
return 0;
}
运行结果:
如果在函数的内部存在一个与全局变量同名的局部变量,编译器并不会报错,而是在函数中屏蔽全局变量(也就是说在这个函数中,全局变量不起作用)。如:
#include<stdio.h>
int a;
int b=520;
void func()
{
int a=333;
int b=666;
printf("func:a=%d,b=%d\n",a,b);
}
int main()
{
printf("main:a=%d,b=%d\n",a,b);
func();
printf("main:a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
#include<stdio.h>
int a;
int b=520;
void func()
{
a=333;
int b=666;
printf("func:a=%d,b=%d\n",a,b);
}
int main()
{
printf("main:a=%d,b=%d\n",a,b);
func();
printf("main:a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
在这个代码里面因为函数func里面没有定义一个a的变量而b定义了,因此a改变的是全局变量而b改变的是局部变量。
假如我们把全局变量定义在函数之后会怎么样?
#include<stdio.h>
void func()
{
count++;
}
int count=1;
int main()
{
func();
printf("count=%d\n",count);
return 0;
}
运行结果:
报错了。此时可以使用extern关键字 。
用extern关键字可以告诉编译器我们在后面定义了这个变量。
#include<stdio.h>
void func()
{
extern count;
count++;
}
int count=1;
int main()
{
func();
printf("count=%d\n",count);
return 0;
}
运行结果:
此时就编译成功了。
注意:不要大量使用全局变量。
使用全局变量会使程序占用更多的内存,因为全局变量从被定义时开始,直到程序退出才被释放。
污染命名空间,虽然局部变量会屏蔽全局变量,但这样一来也会降低程序的可读性,人们往往很难一下子判断出每个变量的含义和作用范围。
提高了代码的耦合性,代码过长时,不知道全局变量被哪些函数使用过。(内聚性强,耦合性低)