Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中静态全局变量和非静态全局变量的区别_C_Variables_Scope - Fatal编程技术网

C语言中静态全局变量和非静态全局变量的区别

C语言中静态全局变量和非静态全局变量的区别,c,variables,scope,C,Variables,Scope,“静态全局变量”和 C语言中的“非静态全局变量” 请举例说明它们的不同之处 (因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,可以在任何块中使用。我不知道如何区分它们。) 有人能用代码解释一下吗?基本上有四种情况: 在函数外部声明,没有static 在函数外部声明,带有静态 在函数内部声明,没有static 在函数内部声明,带有static 让我们依次讨论这些问题 在函数外部声明,没有静态 这是一个传统的全球符号。您可以从任何源文件访问它(尽管在另一个源文件中,您通常需要exte

“静态全局变量”和 C语言中的“非静态全局变量”

请举例说明它们的不同之处

(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,可以在任何块中使用。我不知道如何区分它们。)
有人能用代码解释一下吗?

基本上有四种情况:

  • 在函数外部声明,没有
    static
  • 在函数外部声明,带有
    静态
  • 在函数内部声明,没有
    static
  • 在函数内部声明,带有
    static
让我们依次讨论这些问题

在函数外部声明,没有
静态

这是一个传统的全球符号。您可以从任何源文件访问它(尽管在另一个源文件中,您通常需要
extern
声明)

声明在函数外部,带有
静态

这就是你所问的“静态”全局。您只能在定义它的源文件中访问它。它是该源文件的“私有”,但您可以从该源文件中的任何函数(实际上,该源文件中在其声明下方出现的任何函数)访问它。与任何全局变量一样,它在程序生命周期内保持其值

在函数内部声明,没有
静态

这是一个传统的局部变量。您只能在该函数中访问它。每次调用函数(包括递归调用)时,都会得到变量的一个新实例。如果不初始化它,它将包含一个不可预测的值。它不会在调用之间保持其值

在函数内部声明,带有
静态

这是一个静态局部变量。您只能在该函数中访问它。它只有一个副本,在所有函数调用(包括递归调用)之间共享。如果不初始化它,它将从零开始。它在调用之间保持其值

在其中三种情况下,如果不提供显式初始值设定项,则保证将变量初始化为0。但对于真正的局部变量,如果不提供显式初始值设定项, 它首先包含一个不可预测的值,这是您无法依赖的


形式上,这里有两个概念,可见性和生命周期。真正的全局变量在程序中的任何位置都可见。静态全局变量仅在其源文件中可见。局部变量仅在其函数中可见。所有全局变量和静态变量都有静态持续时间——它们的持续时间和程序的持续时间一样长。(也就是那些保证初始化为0的变量。)真正的局部变量具有“自动”持续时间——它们随着包含函数的调用和返回而来来去去去。

简单阅读一下您最喜欢的C资源中关于关键字
static
的内容,就会发现答案。基本上,
静态
全局变量不能在其定义的文件之外以名称引用;非静态全局变量可以在定义它的源文件之外的其他源文件中按名称引用。相当彻底地覆盖非静态情况(甚至冗长)。
static
的大小写很简单-变量可以在定义它的源文件中按名称访问,而不是在任何其他源文件中。如果您的混淆是英文的:“global”和“[non-]static”可以是任意顺序,句子的意思是相同的。@Jonathan Leffler,英文可能是他的混淆。如果编辑失败,你能还原那个部分吗?你可以撤消它。我不认为这是一个问题,但如果你认为是,你可以解决它。这是一个高质量的答案。我真的很感激。谢谢