第九章——函数的作用域规则
1. 函数的作用域规则
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有两个地方可以声明变量:
- 在函数内部申明的局部变量
- 在所有函数外部声明的全局变量
2. 局部变量
在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。建议在函数内部使用的变量声明在函数内部。
我们以求 0-100 中质数的程序为例,虽然函数isPrime()
和main()
中都有参数 i,但是由于是在不同的两个函数中,作用域不同,这两个参数无法相互访问。
另外再isPrime()
这个函数中,我们把int i = 2;
放在循环体这个块之外声明,就是因为我们需要在后面去判断 i 和 num 的大小关系,如果再循环体声明这个变量我们就无法访问了。
#include <stdio.h>
int isPrime(int num) {
int i = 2;
for (; i <= num; i++) {
//遇到第一个因数则跳出循环
if (num % i == 0)
break;
}
//如果该因数等于这个数本身则表明为质数,返回真
if (i == num)
return 1;
else
return 0;
}
int main() {
for (int i = 2, count = 0; i <= 100; i++) {
if (isPrime(i)) {
printf("%-3d", i);
count++;
//判断质数的个数,五个质数就换行
if (count % 5 == 0)
printf("\n");
}
}
return 0;
}
3. 全局变量
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
下面是一个使用全局变量的例子:
#include <stdio.h>
/* 全局变量声明 */
int global;
int main() {
/* 局部变量声明 */
int a = 10, b = 20;
/* 访问全局变量 */
global = a + b;
printf("Value of a = %d, b = %d and global = %d.\n", a, b, global);
return 0;
}
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,则会优先使用局部变量。
#include <stdio.h>
/* 全局变量声明 */
int global = 10;
int main() {
/* 局部变量声明 */
int global = 20;
printf("Value of global = %d.\n", global);
return 0;
}
4. 初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,因为全局变量属于静态变量(static),而局部变量是动态变量(auto),所有静态变量未初始化都默认为0 或者 NULL,而动态变量未初始化为任意有效值。