当前位置: 首页 > 知识库问答 >
问题:

论C++中的局部和全局静态变量

鱼征
2023-03-14
void foo () {   
    static int x = 0;
    ++x;

    cout << x << endl;
}

int main (int argc, char const *argv[]) {
    foo();  // 1
    foo();  // 2
    foo();  // 3
    return 0;
}

与比较

static int x = 0;

void foo () {   
    ++x;

    cout << x << endl;
}

int main (int argc, char const *argv[]) {
    foo();  // 1
    foo();  // 2
    foo();  // 3
    return 0;
}

共有1个答案

柴寂离
2023-03-14

不同之处在于:

  • 该名称只能在函数内访问,且没有链接。
  • 在第一次执行达到定义时初始化它,而不一定是在程序的初始化阶段。

第二个区别对于避免静态初始化顺序的失败是有用的,在静态初始化顺序中,全局变量可以在初始化之前被访问。通过将全局变量替换为一个返回对局部静态变量的引用的函数,您可以保证它在任何东西访问它之前被初始化。(但是,仍然不能保证它不会在任何东西完成访问之前被销毁;如果您认为需要全局可访问的变量,您仍然需要非常小心。请参阅注释以获得在这种情况下提供帮助的链接。)

 类似资料:
  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • 问题内容: 是否可以在Go中定义一个局部变量,该局部变量可以从一个函数调用到另一个函数保持其值?在C语言中,我们可以使用保留字。 在C中的示例: 问题答案: 使用闭包: 函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可以访问它们就可以保留。 它不必在全局范围内,只需在函数定义之外即可。 (去操场上的样本)

  • 问题内容: 我有一个关于可变范围的问题。 例如: 现在,我创建两个线程,并为每个线程创建一个实例。 当我在每个线程中调用时,可以保证线程安全吗? 本地变量存储在哪里?每个线程的堆栈?堆空间? PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的! 问题答案: 局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变

  • 问题内容: 我正在尝试使用exec运行一段python代码。 这导致以下输出 但是,如果我将代码更改为此- 然后工作正常-提供以下输出- 显然,A存在并且可以访问-在第一段代码中出了什么问题?我正在使用2.6.5,欢呼声, 科林 更新1 如果我检查类中的locals()- 然后很明显,locals()在两个地方都不相同- 但是,如果我这样做,就没有问题- 更新2 好的,所以这里的文档-http:

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 问题内容: 我以为我了解了Java中局部变量和全局变量之间的区别,直到今天看到一个示例。在这段代码中,我们尝试将元素添加到方法的链接列表中: 我不明白的是,为什么在关闭方法后newElement不会消失?因为这是局部变量,并且未在任何地方的类中定义。这是此类的完整代码: } 先感谢您 问题答案: 这是 变量 和 对象的 混合,确实是局部变量,在方法结束后会丢失,但是引用指向一个 对象 。如果没有引