请选择 进入手机版 | 继续访问电脑版
查看: 51|回复: 0

[资料分享] 基于变量的作用域讲解

[复制链接]

签到天数: 193 天

[LV.7]化身百千

发表于 2019-3-6 19:09:50 | 显示全部楼层 |阅读模式
在这一节中我们来学习一下关于变量的作用域。在前面的课程中我们已经知道如何定义变量,并对其赋值和计算,但并没有对其作用域做额外的说明。其实,我们定义的变量并不会一直有效,它只会在其作用域内有效,并在其作用域外失效。

一、局部变量

        我们最先是在main函数内部定义了一些变量并使用它们,例如:

int main(int argc, char *argv[])
{
        int a;
        int b;
        int c;
        //do something
        return 0;
}

        像这样在函数(并非只有main函数,所有函数都一样内部的变量被称为局部变量,它们的作用域就是当前函数内部。也就是说,这些变量只能在其内部使用,而不能在函数外部使用。

        同样的结构化语句if else、while、do while、for、switch等,这些结构内部也可以定义变量,例如:

if (is_true)
{
        int a;
        int b;
        //do something
}
else
{
        int c;
        int d;
        //do something
}

while (is_true)
{
        int a;
        int b;
        //do something
}

for (int i = 0; i < 10; i++)
{
        int a;
        int b;
        //do something
}

switch (val)
{
        case 1:
        {
                int a;
                int b;
                //do something
                break;
        }
        case 1:
        {
                int a;
                int b;
                //do something
                break;
        }
        default:
        {
                int a;
                int b;
                //do something
                break;
        }
}

        这些在结构化语句的内部的变量的作用域为结构化语句内部。注意,对于switch中在case内部定义的变量的作用域就是在当前case。我们可以简单理解为在大括号内部定义的变量,其作用域就是在当前大括号中,在当前大括号外部无效。对于循环嵌套和分支嵌套程序来说都是一样的。关于这一点不再赘述。

        注意,当一个嵌套结构中出现两个不同作用域的变量时,变量的名称可以相同,在使用时以其小作用域为准。例如:

int main(int argc, char *argv[])
{
        int a;
        int b;
        //do something
        for (int i = 0; i < 10; i++)
        {
                int a;
                int b;
                //do something
                if (i == 4)
                {
                        int a;
                        int b;
                        //do something
                }
        }
        //do something

        return 0;
}

        这样的程序是合法的。但在使用这些不同作用域下的同名变量时要格外注意他们的作用域。所以我们建议读者在定义变量时不要将它们定义为相同的名称。



二、全局变量

        与局部变量相对的就是全局变量,我们把定义在函数外部的变量称为全局变量,这些变量的作用域为整个程序,也就是说所有的函数和结构化语句都可以使用他们,例如

/* a.c */
int a;
int b;
       
int afunc(void)
{
    a = 2;
    b = a;
        //do somethine
        return 0;
}

        另外,在上一节中我们已经学习了如何进行多个源文件一起编译,那么全局变量在其它文件中是否也生效呢?答案是肯定的。当我们在a.c文件中定义了一个全局的变量i,而在另一个源文件b.c中是无法直接使用这个变量的,我们需要使用extern关键字在函数外部声明一个文件外部变量

/* b.c */
extern int a;
extern int b;
       
int bfunc(void)
{
    a = 2;
    b = a;
        //do somethine
        return 0;
}

        这样就可以在b.c中使用a.c中定义的变量了。注意extern int a;和extern int b;只是告诉编译器,在当前文件中需要使用当前文件外部的全局变量,而不是定义这些新变量。当然,这些变量在b.c中也是全局的

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

返回顶部