关于C#:静态存储类


Static storage class

我是C的初学者,目前正在学习数据类型修订章节。我已经解决了很多静态存储类的程序。静态存储类具有本地作用域。在下面的代码中,静态变量声明在主变量之上,即全局变量。这有可能吗?根据静态存储类的特点,O/P是正确的。

1
2
3
4
5
6
static int y ;
main( )
{
static int z ;
printf ("%d %d", y, z ) ;
}

有人能告诉我主变量上面的静态变量声明是正确的吗?如果这是正确的,请尝试用外行语言解释。


存储类和范围是不同的。static关键字不影响作用域。

存储类与对象的生存期或存储持续时间相关:对象的创建时间和生存期结束时间。不幸的是,由于历史原因,存储类和其他概念有些混合。存储类有一些关于某物存储位置的含义。C的发展使得在很大程度上取决于实现对存储内容的决定。通常,程序员应该只关心什么时候存储了一些东西。

存储类是一个对象的属性:实际存储的对象(值)。作用域是标识符的属性:用于引用对象(或类型或函数)的名称。

有四种存储持续时间:静态、线程、自动和已分配。作用域有四种:函数、文件、块和函数原型。它们的规则有些复杂(也依赖于链接,可以是外部的、内部的,也可以是无链接),所以我不会全部描述它们。

如果您将一个对象定义为static,那么它的生存期就是程序的整个执行过程。默认情况下,在函数体中声明的普通对象具有自动存储持续时间。它的生存期是从程序执行进入它所在的块的时间到程序执行退出它所在的块的时间。每次执行进入块时,都会创建对象的新实例。如您所见,Lifetime是在程序运行时应用的属性。

在函数体中声明对象时,声明中的标识符(名称)具有块范围。该名称仅在块内可见。作用域是编译时属性;它影响源代码的哪些部分可以看到名称。例如,如果函数A在运行时调用函数B,则函数B看不到函数A中的名称。即使函数A中的对象在函数B执行时存在(运行时属性),但它们的名称(编译时属性)在函数B中不可见。

函数体中的名称具有块范围,但它可以引用具有自动(块)存储持续时间的对象或具有静态(整个程序)存储持续时间的对象。

当您在函数体外部声明一个对象时,它的标识符具有文件范围。它对文件中所有以下源代码都可见。

还有一个属性叫做链接。链接是一种方法,通过这种方法,可以使不同范围中的相同标识符引用同一对象。(一个源文件中的foo可以用来引用同一对象,即另一个源文件的foo。)


y是一个全局变量,但由于它被声明为static,所以它只在编译单元中可见,即这个C文件。如果您正在编译多个对象并将它们链接在一起,则其他单元将无法访问它。在这个简单的示例中,全局变量是否声明为静态变量与此无关。