C 中的变量作用域 – 局部和全局作用域解释

简介: C 中的变量作用域 – 局部和全局作用域解释

dd8aaaacc4c08637ea769e5b1455d612.png

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

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


正文起:


变量的作用域是什么?


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

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

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

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


C 中变量的局部作用域 – 嵌套块


在本节中,您将了解局部变量在 C 中的工作原理。您将首先编写几个示例,然后概括范围原则。

▶ 下面是第一个示例:

#include <stdio.h>
int main() 
{
    int my_num = 7;
    {
        //add 10 my_num
        my_num = my_num +10;
        //or my_num +=10 - more succinctly
        printf("my_num is %d",my_num);
    }
    return 0;
}


让我们了解上述程序的作用。

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

  • 该函数有一个整数变量,该变量在外部块中初始化为 7。main()my_num
  • 有一个内部块试图向变量添加 10 .my_num


现在,编译并运行上述程序。下面是输出:

1. //Output
2. 
3. my_num is 17

您可以看到以下内容:

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


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


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

1. Line   Message
2. 9      error: 'new_num' undeclared (first use in this function)


这是因为变量是在内部块中声明的,其范围仅限于内部块。换句话说,它是内部块的本地,无法从外部块访问。new_num

基于上述观察结果,让我们写下以下变量局部范围的通用原则:


{
  /*外部*/
{
此部分开始之前外部的内容
        可以在这里访问
/*内部*/
}
内部的内容在这里无法访问
 }


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);
}


在上面的例子中,

  • 整数变量在函数内声明。my_nummain()
  • 在函数内部,打印出 的值。main()my_num
  • 还有另一个函数尝试访问和打印 的值。my_func()my_num
  • 当程序执行从函数开始时,函数内部会调用。main()my_func()main()

 现在编译并运行上面的程序。您将收到以下错误消息:


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

如果您注意到,在 上,函数尝试访问在函数内声明和初始化的变量。line 13my_func()my_nummain()


因此,变量的作用域仅限于函数,并且称为函数的 局部。 my_num main() main()

我们可以将局部作用域的概念概括地表示如下:

{
/*代码1*/
    此处无法访问代码2 的内容
}
{
/*代码2*/
    此处无法访问代码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);
}


在上面的例子中,

  • 变量在函数和 .my_nummain()my_func()
  • 我们尝试访问函数内部,并打印其值。my_nummain()
  • 我们在函数内部调用函数。my_func()main()
  • 该函数还尝试访问 的值并将其打印出来。my_func()my_nu

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


//Output
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

变量的全局范围原则可以总结如下:


此处声明所有全局变量
函数1()
  {
所有全局变量都可以在函数1中访问
}
函数2()
  {
所有全局变量都可以在函数2中访问
}

总结


在本教程中,你已了解本地范围和全局范围之间的差异。这是关于 C 语言中变量范围的入门教程。

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

相关文章
|
1月前
|
自然语言处理 JavaScript 前端开发
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
45 0
|
1月前
|
JavaScript 前端开发 Java
什么是作用域,它的作用是什么?
什么是作用域,它的作用是什么?
20 1
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是作用域(scope),并说明全局作用域、局部作用域和块级作用域的区别。
JavaScript中的作用域规定了变量和函数的可见性与生命周期。全局作用域适用于整个脚本,变量可通过全局对象访问,可能导致命名冲突和内存占用。局部作用域限于函数内部,每次调用创建新作用域,执行完毕后销毁。ES6引入的块级作用域通过`let`和`const`实现,变量仅在其代码块内有效,并有暂时性死区。作用域机制有助于代码组织和变量管理。
31 1
|
1月前
|
自然语言处理 JavaScript 前端开发
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(下)
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(下)
|
1月前
|
JavaScript
JS作用域(全局作用域+局部作用域)
JS作用域(全局作用域+局部作用域)
18 0
|
11月前
|
存储 JavaScript 前端开发
Javascript作用域 (局部作用域和全局作用域) 详细介绍
Javascript作用域 (局部作用域和全局作用域) 详细介绍
85 0
|
安全 Unix vr&ar
一文刨析C/C++全局常量的定义
一文刨析C/C++全局常量的定义
|
JavaScript 前端开发
函数作用域和块作用域
函数作用域和块作用域
88 0
|
PHP 开发者
超全局作用域|学习笔记
快速学习超全局作用域
82 0
超全局作用域|学习笔记
|
自然语言处理 JavaScript Java
Day14 - 词法作用域、块级作用域、作用域链、静态动态作用域
Day14 - 词法作用域、块级作用域、作用域链、静态动态作用域
127 0