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



