第九章——函数的作用域规则

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,而动态变量未初始化为任意有效值