各种编程语言和情况下,静态变量的一般含义是什么?

5

静态变量通常是:(在大多数编程语言中)共享的、持久的,并且分配在程序的代码段上。

但是这与单词“static”有什么关系呢?这有什么是静态的吗?我以为static表示不会改变?

例如,在vb.net中,静态被写成shared,这意味着一个成员函数可以在没有实例化对象的情况下访问。在函数内部的static通常意味着变量的生命周期是整个程序的生命周期。看起来静态变量存储在计算机的代码段中。根据这个例子,我的理解是正确的吗?


2
据我所知,它意味着静态存储。 - Pubby
3
它真的需要有意义吗?如果我们用“frobbly”代替“static”,概念不是一样的吗? - Jon
1
@RamyAlZuhouri:是的,但变量和类型的命名是基于我们为问题域构建的数据模型。语言关键字的选择具有非常不同的标准。例如,历史一致性非常重要,甚至比从语言学角度准确还要重要。因此,虽然关键字当然应该是自我描述的,但其中并不仅限于此。 - Jon
1
@SList 计算机行业并不是由微软领导的。特别是在像“static”这样的东西的含义方面,微软是相对较晚的参与者,甚至在它获得其含义时还不存在。 (微软在营销术语方面非常创新,但在技术词汇方面则不太如此。) - James Kanze
4
在单元测试中,这意味着出现了很多问题。 - GordonM
显示剩余11条评论
7个回答

20

我认为“static”这个关键字很合适。它意味着您声明为静态的变量将在整个程序执行过程中保持存储在相同位置。

我以为static意味着不改变

这对应于“const”关键字。“const”表示它不会改变,“static”表示它不会“移动”,即始终存储在相同位置。


3
只要变量存在,任何一个变量实例都将被存储在同一位置。 "静态"背后的关键含义是变量没有来去之分。 - James Kanze

8

在编程语言中,静态变量的生死不由变化决定。静态变量始终存活着,它们只有一个实例,要么在程序开始时生成,要么在第一次可见时生成,并持续到程序结束。非静态变量会随着块的进入和退出或类实例的创建和销毁而出现和消失。

在C++中,为了与C兼容,当应用于命名空间作用域的变量时,static具有完全不同的含义:它表示变量具有内部链接而不是外部链接,并且在其他翻译单元中不可见。早期C语言为什么采用static这个词汇,我不知道;我只能猜测他们需要某些东西,但不想引入一个新的关键字。(最初,在最早版本的C语言中,文件范围内的变量遵循Fortran命名的公共块规则:相同名称的所有变量都指向相同的存储。)回顾过去,在 20/20的视觉效果下,默认情况下,文件范围内的变量应具有内部链接,并使用特殊关键字(public?)表示变量具有外部链接。但这在1970年代初显然不太明显。


3

静态变量是指变量存储。在函数调用内,您声明的每个变量都会被推送到堆栈上。与其他变量不同,静态变量不会被推送到堆栈上,它类似于全局变量,可以在整个程序执行期间存活,但只能在声明块内部可见。


1

我认为你只需学习计算机科学中“静态(static)”的含义,而不将其与口语英语相关联,特别是在变量和函数方面,它们在C语言中有稍微不同的结果。


这就是这个问题的本质。我如何将计算机科学中的静态概念与口语英语联系起来。 - user4951
这就是我的回答的重点 - 将两者联系起来没有任何好处。 - user1725145

1

http://dictionary.reference.com/browse/static?s=t中可以得知,static的定义为:

  1. 与固定或静止状态有关的或以此为特征。
  2. 显示出很少或没有变化:静态概念;静态关系。

静态变量是一种即使超出作用域也会保持其状态的变量,与非静态变量相反,后者每次重新进入作用域都会重新初始化 - 因此可以理解为具有“固定状态”或表现出“无变化”。


1
如果可以避免,就不要使用C++中的static。在任何现代语言中,static只意味着只有一个实例,且它永远不会被销毁。这与英文含义不相差太远,并且很容易引出对const/final/readonly的讨论。

1
静态变量指的是,在创建类的多个实例时,该变量仅有一个副本。也就是说,指定类的所有对象都使用相同的内存位置。举个例子,我们有两个线程。在第一个线程中,您创建了一个进度条,在第二个线程中,您需要更新它。在这种情况下,您可以在进度条类中定义一个静态变量来存储进度,并在每个线程中创建一个类的实例。一个线程用于初始化,另一个用于更改静态变量的值。由于两者使用同一个副本,所以第一个线程中的进度将可用。因此,静态意味着不会在创建新实例时更改其位置。或者我们可以说,它保留其状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接