作用域

✍ dations ◷ 2025-06-29 02:45:03 #计算机编程

在电脑程序设计中,作用域(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++是静态作用域语言,但在宏中用到的名字,也是动态作用域。

相关

  • 锥虫锥虫(Trypanosoma,希腊语:trypaô钻,soma体)是一种带鞭毛的原生动物(鞭毛虫),它可寄生在多种温血动物和冷血动物中。布氏罗得西亚锥虫(Trypanosoma brucei rhodesiense)和布氏冈比亚锥
  • 松博尔松博尔(塞尔维亚语:Sombor,德语:Zombor)位于塞尔维亚北部,是西巴奇卡州的首府,面积1,178平方公里,人口51,471人(2002年)。
  • 小龙虾小龙虾可以指:
  • 缓和政策缓和政策(法语:Détente)或称低荡,原意为缓和紧张关系。在国际政治上,缓和政策指的是1960年代末期至1970年代末期期间,美国与苏联两国于军备竞赛、外交立场的基本态度,从紧张对立渐
  • 突破倡议突破倡议(Breakthrough Initiatives)是一个由俄国科技业富豪尤里·米尔纳于2015年创建的计划,准备在十年内,投资1亿美金,寻找外星生命。 整个计划分为几个项目。突破聆听项目将会
  • 7人水星计划7人是1959年4月为水星计划而挑选的七位宇航员。NASA宇航员组1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 · 11 · 12 · 13 · 1
  • 萘钠萘钠是一种有机盐,化学式为NaC10H8/ C10H8Na,离子化学式为Na+C10H8−。在实验室研究中,它被用作有机化学、有机金属化学和无机化学合成中的还原剂。尚未制得固体,一般是现配现用
  • 斜面升船机斜面升船机是用于内河航道克服水头落差沿钢轨斜面运动的升船机。 早在古埃及就有了尼罗河上的斜面升船机。木制滑道上覆盖泥以减少摩擦。隆库尔斜面升船机(英语:Ronquières i
  • 2018年冬季奥林匹克运动会短道速滑男子1000米比赛2018年冬季奥林匹克运动会短道速滑男子1000米比赛于2018年2月13日和17日在韩国江陵冰上运动场举行。加拿大选手塞缪尔·吉拉德在决赛中以1分24秒650的成绩夺冠,这是加拿大首
  • 罗睺罗睺(梵语:राहु),又称拉胡、拉胡天神,是印度神话中的阿修罗之一,是达耶提耶王毗婆罗吉提(Vipracitti)与辛悉迦(Simhika,达刹之女)的儿子。罗睺经常吞食日月,造成日蚀和月蚀。法华经