作用域

✍ dations ◷ 2025-11-29 14:09:00 #计算机编程

在电脑程序设计中,作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。不同的编程语言可能有不同的作用域和名字解析。而同一语言内也可能存在多种作用域,随实体的类型变化而不同。作用域类别影响变量的绑定方式,根据语言使用静态作用域还是动态作用域变量的取值可能会有不同的结果。

名字空间是一种作用域,使用作用域的封装性质去逻辑上组群起关相的众识别子于单一识别子之下。因此,作用域可以影响这些内容的名字解析。

程序员常会缩进他们的源代码中的作用域,改善可读性。

下列例子显示了C++语言中多种不同的作用域声明:

namespace N{                        // 命名空间作用域,仅是群组织别名   class C   {                     // 类作用域,定义/声明成员变量和函数      void f (bool b)      {                  // 函数作用域,包含可执行语句         if (b)         {               // 条件执行语句的无名作用域           ...         }      }   };}

静态作用域与动态作用域

静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。

大多数现在程序设计语言都是采用静态作用域规则,如C/C++、C#、Python、Java、JavaScript……

相反,采用动态作用域的变量叫做动态变量。只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。这意味着如果有个函数f,里面调用了函数g,那么在执行g的时候,f里的所有局部变量都会被g访问到。而在静态作用域的情况下,g不能访问f的变量。动态作用域里,取变量的值时,会由内向外逐层检查函数的调用链,并打印第一次遇到的那个绑定的值。显然,最外层的绑定即是全局状态下的那个值。

采用动态作用域的语言有Pascal、Emacs Lisp、Common Lisp(兼有静态作用域)、Perl(兼有静态作用域)。C/C++是静态作用域语言,但在宏中用到的名字,也是动态作用域。

相关

  • 革兰氏阴性杆菌革兰氏阴性菌(英语:Gram-negative bacteria)泛指革兰氏染色反应呈红色的细菌。在革兰氏染色实验中,首先添加了结晶紫,再添入另一种复染染料(通常使用番红),从而将所有的革兰氏阴性菌
  • 左传《左传》是古中国华夏先民所著的一部编年体史书,共三十五卷,《十三经》中篇幅最长,在四库全书中为经部。《左传》全称《春秋左氏传》,原名《左氏春秋》,汉朝时又名《春秋左氏》 ,
  • 阿卡迪亚人阿卡迪亚(法语:Acadie;英语:Acadia)曾是法国的殖民地,范围覆盖北美洲的东北部,包括现魁北克东部、整个加拿大海洋省份、和新英格兰,往南一直延伸到费城;而实际上法国政府指明的是与大
  • 骷髅总队纳粹集中营转移营比利时:布伦东克堡垒 · 梅赫伦转移营法国:居尔集中营 · 德朗西集中营意大利:波尔查诺转移营荷兰:阿默斯福特集中营 · 韦斯特博克转移营挪威:法斯塔德集中营部
  • 铝土矿铝土矿(英语:Bauxite)是最重要的含铝矿物,主要成分为Al(OH)3、软水铝石、硬水铝石,及针铁矿、赤铁矿、石英等。铝土矿1821年首次被地质学家Pierre Berthier发现,其英文名Bauxite也
  • 任意子任意子(英语:anyon)是数学和物理学中的一个概念。它描述一类只在二维系统中出现的粒子。它是对费米子和玻色子概念的广义化。在石墨烯、量子霍尔效应等二维物理系统中任意子这
  • 蚕蛹家蚕(学名:Bombyx mori)是鳞翅目的昆虫,丝绸的主要原料来源,在人类经济生活及文化历史上占有重要地位。原产中国,华南地区俗称之蚕宝宝或娘仔。家蚕的英文名为“silkworm”(意为“
  • 西德广播公司西德广播公司(德语:Westdeutscher Rundfunk)是位于德国科隆的一个公共广播电视公司,也是德国公共广播联盟的九个加盟公司之一。播出地区是北莱茵-威斯特法伦州。
  • 中国医院等级中国医院的等级划分是中华人民共和国卫生行政管理部门对其行政管辖范围内医疗机构的评审制度,包括了对医院资质的审核标准。目前中国实行三级医疗服务体系,各个等级分为甲、乙
  • 庄前站坐标:31°36′43″N 120°18′01″E / 31.61208°N 120.30041°E / 31.61208; 120.30041庄前站位于无锡市梁溪区锡澄路。车站共4层,其中站台层位于地下二层,站厅层位于地上二层