在编程中,你经常需要处理变量的作用域。变量的作用域决定了你是否可以在特定代码块内访问和修改它。

在本教程中,你将了解 C 编程语言中的变量作用域。你将看到一些代码示例,以帮助你了解局部变量和全局变量之间的差异。

变量的作用域是什么

在继续了解局部和全局变量作用域之前,让我们了解作用域的含义。

简单来说,变量的作用域就是它在程序中的生命周期。

这意味着变量的作用域是整个程序中变量被声明、使用和可以修改的代码块。

在下一节中,你将了解变量的局部作用域。

C 语言中变量的局部作用域——嵌套块

在本节中,你将了解局部变量如何在 C 语言中工作。你将首先编写几个示例,然后概括作用域原则。

▶ 这是第一个示例:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        //给 my_num 加上 10
        my_num = my_num +10;
        //或者使用更简洁的 my_num +=10 -
        printf("my_num is %d",my_num);
    }
    
    return 0;
}

让我们了解一下上面的程序是做什么的。

在 C 语言中,你用 {} 分隔代码块。左花括号和右花括号分别表示块的开始和结束。

  • main() 函数有一个整数变量 my_num,它在代码块外部被初始化为 7。
  • 代码块内部有一行代码将 10 添加到变量 my_num

现在,编译并运行上面的程序,输出结果:

//输出

my_num is 17

你可以看到以下内容:

  • 代码块内部能够访问在代码块外部声明的 my_num 的值,并通过向其添加 7 来修改它。
  • 如输出所示,my_num 的值现在为 17。

C 语言中变量的局部范围——嵌套块示例 2

▶ 这是另一个相关的例子:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        int new_num = 10;
    } 
    printf("new_num is %d",new_num); //this is line 9
    return 0;
}
  • 在这个程序中,main() 函数在代码块外部有一个整数变量 my_num
  • 另一个变量 new_num 在代码块内部初始化。
  • 我们试图在代码块外部访问和打印代码块内部的 new_num 的值。

如果你尝试编译上面的代码,你会注意到它没有成功编译。你将收到以下错误消息:

Line   Message
9      error: 'new_num' undeclared (first use in this function)
这是因为变量 new_num 是在代码块内部声明的,其作用域仅限于代码块内部。换句话说,它对于代码块内部是本地的,不能从代码块外部访问。

基于上述观察,让我们写下以下变量局部作用域的通用原则:

{
	/*OUTER BLOCK*/
    
      {
    	
        
        //此块开始之前的代码块外部的内容
        //可以在这里被访问
        
        /*INNER BLOCK*/
        
        
      }
     
       //此处无法访问代码块内部的内容
 }

C 语言中变量的局部作用域——不同的块

在前面的示例中,你了解了如何无法从代码块外部访问嵌套代码块内部的变量。

在本节中,你将了解在不同块中声明的变量的局部作用域。

#include <stdio.h>

int main()
{
    int my_num = 7;
    printf("%d",my_num);
    my_func();
    return 0;
}

void my_func()
{
    printf("%d",my_num);
}

在上面的例子中,

  • main() 函数中声明整型变量 my_num
  • main() 函数内部,打印出 my_num 的值。
  • 还有另一个函数 my_func() 尝试访问和打印 my_num 的值。
  • 由于程序从 main() 函数开始执行,因此在 main() 函数内部调用了 my_func()

▶ 现在编译并运行上述程序,你将收到以下错误消息:

Line   Message
13     error: 'my_num' undeclared (first use in this function)

如果你注意到,在第 13 行,函数 my_func() 尝试访问在 main() 函数中声明和初始化的 my_num 变量。

因此,变量 my_num 的作用域被限制在 main() 函数中,并且被称为 main() 函数的局部变量。

我们可以将这种局部作用域的概念一般性地表示如下:

{

	/*BLOCK 1*/
    // 此处无法访问 BLOCK 2 的内容
    
}


{

	/*BLOCK 2*/
    // 此处无法访问 BLOCK 1 的内容
    
}

C 语言中变量的全局作用域

到目前为止,你已经了解了 C 语言中变量的局部作用域。在本节中,你将学习如何在 C 语言中声明全局变量。

▶ 让我们从一个例子开始。

#include <stdio.h>
int my_num = 7;

int main()
{
    printf("my_num can be accessed from main() and its value is %d\n",my_num);
    //call my_func
    my_func();
    return 0;
}

void my_func()
{
  printf("my_num can be accessed from my_func() as well and its value is %d\n",my_num);
}

在上面的例子中,

  • 在函数 main()my_func() 之外声明变量 my_num
  • 我们尝试访问 main() 函数中的 my_num,并打印其值。
  • 我们在 main() 函数中调用 my_func() 函数。
  • 函数 my_func() 也尝试访问 my_num 的值,并将其打印出来。

该程序编译没有任何错误,输出如下所示:

//输出
my_num can be accessed from main() and its value is 7
my_num can be accessed from my_func() as well and its value is 7

在这个例子中,有两个函数——main()my_func()

但是,变量 my_num 不是程序中任何函数的局部变量。这种对任何函数都不是局部的变量被称为具有全局作用域,称为全局变量。

全局变量作用域的原理可以总结如下:

//所有全局变量都在这里声明
function1()
	{
    
    // 所有全局变量都可以在 function1 中访问
    
    }
function2()
	{
    
    // 所有全局变量都可以在 function2 中访问
     
    }
    

总结

在本教程中,你了解了局部作用域和全局作用域之间的区别。这是关于 C 语言中变量作用域的介绍性教程。

在 C 语言中,有一些访问修饰符来控制变量的访问级别。你可以在声明变量时使用相应的关键字来更改访问权限。

祝你编码愉快!

原文:Variable Scope in C – Local and Global Scope Explained,作者:Bala Priya C