变量(计算机科学)

电脑编程, 一个多变的是一个抽象存储位置与关联的符号名称,其中包含一些已知或未知数量的信息,称为价值;或更简单的术语,变量是特定位或数据类型的命名容器(例如整数漂浮细绳ETC...)。变量最终可以与内存地址。变量名是通常的方式参考根据上下文,除了指变量本身之外,存储的值除了引用变量本身。名称和内容的分离允许名称独立于其代表的确切信息。计算机中的标识符源代码边界价值期间运行,因此变量的价值可能在过程中发生变化程序执行.[1][2][3][4]

编程中的变量可能不直接与数学中的变量。后者是抽象的,没有提及物理对象(例如存储位置)。计算变量的值不一定是方程或者公式就像数学一样。计算机编程中的变量经常被赋予长名,以使其相对描述其使用,而数学中的变量通常具有简短的,单位或两个字符的名称,用于转录和操纵。

变量的存储位置可以由几个不同的标识符引用,这种情况称为混叠。使用一个标识符为变量分配值将更改可以通过其他标识符访问的值。

编译器必须将变量的符号名称替换为数据的实际位置。虽然变量的名称,类型和位置通常保持固定,但在程序执行过程中可能会更改存储在位置中的数据。

变量的动作

至关重要的编程语言,值通常可以是访问或者更改随时。在纯的功能逻辑语言,变量是边界表达并在整个过程中保持单一价值寿命由于要求参考透明度。在命令式语言中,(命名)表现出相同的行为常数(符号常数),通常与(正常)变量形成鲜明对比。

取决于类型系统在编程语言中,变量可能只能存储指定的数据类型(例如。整数或者细绳)。或者,数据类型只能与当前值相关联,从而允许单个变量存储编程语言支持的任何内容。

变量是存储值的容器。

变量和范围:

  • 自动变量:仅当调用函数时,函数中的每个局部变量才会存在,并且当函数退出时消失。这样的变量称为自动变量。
  • 外部变量:这些是函数外部的变量,可以通过任何函数访问名称。这些变量永久存在。相反,随着函数的出现和消失而被调用和退出,即使使它们返回的功能,它们也会保留其价值。

标识符引用变量

引用变量的标识符可用于访问变量,以读取值或更改值或编辑其他属性变量(例如访问权限)的信号量, ETC。

例如,标识符可能会引用变量“total_count“并且变量可以包含数字1956。如果标识符引用了相同的变量”r“同样,如果使用此标识符”r“变量的值已更改为2009年,然后使用标识符读取值”total_count“将产生2009年的结果,而不是1956年。

如果仅由单个标识符引用变量,则该标识符可以简单地称为变量的名称;否则我们可以说变量的名称之一。例如,在上一个示例中,标识符”total_count“是有关变量的名称,”r“是同一变量的另一个名称。

范围和范围

范围变量描述了程序中可以使用变量的位置,而程度(也被称为寿命一个变量的描述在程序执行中何时具有(有意义的)值。变量的范围会影响其程度。变量的范围实际上是变量名称的属性,该范围是变量的存储位置的属性。这些不应该与语境(也被称为环境),这是该程序的属性,并且在程序的文本或执行中随点而变化,请参阅范围:概述。更远,对象寿命可能与可变的寿命相吻合,但在许多情况下没有与之息息相关。

范围是重要的一部分名称分辨率变量。大多数语言定义了特定的范围对于每个变量(以及任何其他命名实体),在给定程序中可能有所不同。变量的范围是该变量文本的一部分,该文本的名称具有其含义,并且该变量被认为是“可见的”。进入该范围的入口通常开始变量的寿命(因为它进入上下文),并从该范围退出通常会结束其寿命(因为它不在上下文中)。例如,一个带有“词汇范围“只有在某个功能中才有意义/子例程,或在表达式/陈述的一个块中更细微(因此功能范围或者块范围);这是静态分辨率,可在Parse时间或编译时执行。或者,一个变量与动态范围基于根据特定控制流的全局绑定堆栈解决在运行时解决。仅在某个功能中可访问的变量被称为“本地变量“。 一个 ”全局变量“,或一个具有无限范围的一个,可以转介到程序中的任何地方。

程度另一方面,是一个运行时(动态的)变量的方面。每个捆绑值的变量可以有自己的程度在运行时。绑定的范围是程序执行时间的一部分,在此过程中,变量继续指代相同的值或内存位置。运行程序可能会输入并离开给定范围多次,例如关闭.

除非编程语言功能垃圾收集,一个变量永久超过其范围的变量可能导致内存泄漏,因此永远无法释放为变量分配的内存,因为将用于DealLocation目的的变量不再可访问。但是,可以允许变量绑定延伸到其范围之外,就像LISP中发生的那样关闭和c静态局部变量;当执行回到变量的范围中时,可以再次使用该变量。一个变量,其范围在其范围之前开始的变量被认为是非初始化如果访问,通常具有未定义的任意价值(请参阅野生指针),因为尚未明确给出特定的值。一个变量,其范围在其范围之前结束的变量可能成为一个悬挂的指针自从其价值被摧毁以来,再次被认为是非专业化的。前两个案例描述的变量可以说是超出程度或者未绑定。在许多语言中,尝试使用变量的值超出程度是错误的。在其他语言中,这样做可能会产生不可预测的结果。但是,可以为这样的变量分配一个新值,从而使其具有新的范围。

为了实现空间效率,只有在不再需要时首先使用和释放变量时,才能分配变量所需的内存空间。仅当变量进入范围时才需要一个变量,因此,当每个变量进入范围时,它可以为未使用的变量提供空间。为了避免浪费此类空间,编译器通常会警告程序员,如果声明但未使用变量。

它被认为是良好的编程实践,可以使变量的范围像可行性一样狭窄,以便程序的不同部分不会通过修改彼此的变量来偶然地相互作用。这样做也可以防止距离行动。这样做的常见技术是让程序的不同部分使用不同名称空间,或使单个变量通过任何一种动态变量范围或者词汇可变范围.

许多编程语言采用了保留值(通常命名无效的或者)表示无效或非初始化的变量。

打字

静态打字语言,例如或者ML,一个变量也有一个类型,这意味着只能将某些值存储在其中。例如,类型的变量”整数“禁止存储文本值。

动态键入语言,例如Python,变量的类型是根据其值推断的,并且可以根据其值而变化。在常见的LISP,两种情况同时存在:给出一个类型的变量(如果未确定,则假定为T,通用Supertype)在编译时存在。值还具有类型,可以在运行时检查和查询。

变量的键入也允许多态性在编译时解决。但是,这与面向对象函数调用中使用的多态性不同(称为虚拟功能C ++)基于值类型解决呼叫,而不是允许变量具有的超模型。

变量通常存储简单的数据,例如整数和文字字符串,但是某些编程语言允许变量存储其他的值数据类型也是。这样的语言也可能使功能成为参数多态性。这些功能像变量一样运行以表示多种类型的数据。例如,一个名称的函数length可以确定列表的长度。这样的length功能可以通过在其中包含一个类型变量来成为参数多态性类型签名,由于列表中的元素数量与元素类型无关。

参数

正式参数(或者正式论点)功能也称为变量。例如,在此Python代码段,

>>>防守addtwox):...返回x+2...>>>addtwo57

命名的变量x是一个范围因为在调用函数时给出一个值。整数5是争论这使x它的价值。在大多数语言中,功能参数具有本地范围。这个特定变量命名x只能在addtwo功能(尽管当然其他功能也可以具有称为变量x)。

内存分配

在编程语言中以及给定语言的实现之间,可变分配的细节及其值的表示差异很大。许多语言实现为本地变量,其范围持续到一个函数呼叫致电堆栈,并且当功能返回时自动回收其内存。更普遍,在名称绑定,变量的名称与内存中字节的某些特定块(连续序列)的地址结合,并在变量操纵该块上操作。引用对于编译代码时值大小或未知大小的变量,更为常见。这样的变量引用值的位置,而不是存储值本身,该值是从称为的内存池分配的.

界变量具有值。但是,价值是一种抽象,一个想法。在实施中,一个值由某些代表数据对象,它存储在计算机内存中。该程序或运行环境,必须为每个数据对象搁置内存,并且由于内存是有限的,因此确保在不再需要对象表示某些变量的值时产生此内存以进行重复使用。

必须收回从堆分配的对象,尤其是在不再需要对象的情况下。在一个垃圾收集语言(例如C#爪哇,Python,Golang和Lisp),当存在的变量不再引用它们时,运行时环境会自动回收对象。在非garbage收集的语言中,例如C,程序(和程序员)必须明确分配内存,然后随后将其释放以收回其内存。不这样做会导致内存泄漏,其中堆耗尽了,随着程序的运行,可能会因耗尽可用内存而最终失败。

当变量指的是数据结构动态创建的,其某些组件只能通过变量间接访问。在这种情况下,垃圾收集器(或缺乏垃圾收集器的语言中的类似程序功能)必须处理一种只有一部分可从变量到达的内存。

命名约定

与数学对应物不同,编程变量和常数通常为多字符名称,例如COST或者total。单字符名称最常仅用于辅助变量;例如,ijk为了数组索引变量。

作为语言语法的一部分,在语言层面上执行了一些命名约定,该语言涉及有效标识符的格式。在几乎所有语言中,变量名不能以数字(0-9)开头,并且不能包含空格字符。是否允许在可变名称中允许标点符号因语言而异。许多语言只允许下划线(“ _”)在可变名称中,禁止所有其他标点符号。在某些编程语言中,西吉尔斯(符号或标点符号)固定在变量标识符上,以指示变量的数据类型或范围。

病例敏感性语言和某些语言之间的变量名称也有所不同,需要在命名某些实体中使用某种情况。[注1]大多数现代语言都对大小写;一些较旧的语言不是。某些语言为自己的内部使用保留某些形式的可变名称;在许多语言中,名称以两个下划线(“ __”)开头通常属于此类别。

但是,除了一种语言施加的基本限制之外,变量的命名在很大程度上是一种风格问题。在机器代码级别,不使用变量名称,因此选择的确切名称对计算机无关紧要。因此,变量的名称识别它们,因为其余的只是程序员使程序更易于编写和理解的工具。使用不良的变量名称可以使代码比非描述性名称更难审核,因此通常鼓励清晰的名称。[5][6]

程序员通常会创建并遵守代码样式准则,这些准则提供了有关命名变量或强加精确命名方案的指南。较短的名称键入更快,但描述性较低;更长的名称通常会使程序易于阅读,并且变量的目的更易于理解。但是,可变名称中的极端详细性也可能导致较低的代码。

变量类型(基于寿命)

我们可以根据其寿命对变量进行分类。不同类型的变量是静态的,堆栈动态的,显式的堆动态和隐式堆动力学。一种静态变量也称为全局变量,在执行开始之前,它绑定到存储单元,并保留到同一内存单元格直到终止。一个典型的示例是C和C ++中的静态变量。一个堆栈 - 动态变量称为局部变量,在执行声明语句时,该变量被绑定,并且在过程返回时将其划分。主要示例是C子程序和Java方法中的局部变量。显式堆型变量是无名的(抽象)存储单元,通过程序员指定的显式运行时指令分配和处理。主要示例是C ++中的动态对象(通过新和删除)以及Java中的所有对象。隐式堆型变量仅在分配值时才绑定到堆存储。当值重新分配到变量时,分配和释放发生。结果,隐型堆动力学变量具有最高的灵活性。主要示例是JavaScript,PHP和APL中所有变量中的一些变量。

也可以看看

笔记

  1. ^例如,哈斯克尔要求类型的名称以大写字母开头。

参考

  1. ^编译器:原理,技术和工具,第26–28页
  2. ^Knuth,Donald(1997)。计算机编程的艺术。卷。1(第3版)。雷丁,马萨诸塞州:艾迪生 - 韦斯利。pp。3–4。ISBN 0-201-89683-4.
  3. ^“与变量的编程”.可汗学院。检索3月23日2020.
  4. ^“出现编码器的刮擦”。哈佛大学。检索3月23日2020.
  5. ^如何不选择变量,2012年7月11日检索[Dead Link]
  6. ^Edsger Dijkstra与“有意义的标识符”地狱!