C++ C+中的局部/静态变量范围+;

C++ C+中的局部/静态变量范围+;,c++,variables,static,scope,C++,Variables,Static,Scope,如果我这样写: #include <iostream> int main() { using namespace std; {int n;n=5;} cout<<n; system("pause"); return 0; } #包括 int main() { 使用名称空间std; {int n;n=5;}cout您混淆了作用域和生存期。静态变量的生存期等于程序的生存期,但它们仍然遵循基于声明位置的作用域规则。如何在此程序中使用n 使用

如果我这样写:

#include <iostream>

int main()
{
    using namespace std;

    {int n;n=5;} cout<<n;
    system("pause");
    return 0;
}
#包括
int main()
{
使用名称空间std;

{int n;n=5;}cout您混淆了作用域和生存期。静态变量的生存期等于程序的生存期,但它们仍然遵循基于声明位置的作用域规则。

如何在此程序中使用n

使用名称空间std;
int main()
{
int n;//将n声明为int
n=5;//给它赋值

cout全局作用域中声明为静态的变量的作用域仅限于转换单元。函数中声明为静态的变量的生存期设置为与程序的相同,但在这种情况下不会影响其作用域。必须将
cout
置于声明为
n
的相同作用域中才能使用它。

n的范围就在括号之间:

{int n;n=5;}
所以在块之外,没有n变量


将其设置为静态只会使其值在退出块后保持不变,以便下次再次进入该块时,可以检索上次执行该块时的值,但其作用域仍在括号内。

此处编译器给出错误n未声明,因为此处“{int n;n=5;}它在大括号中声明。大括号告诉我们变量的作用域。当作用域结束时,变量将从内存中删除

对于静态和局部

静态:该变量与全局变量相同,但其值在整个应用程序中保持不变。并且不能使用外部在其他页面上使用该静态变量


局部:局部变量存储在堆栈中,当它们超出范围时将被删除

请不要混淆静态变量的范围和生存时间。范围表示可以访问变量的位置。变量的生存时间是变量在内存中的持续时间。在您的情况下,
x variable的作用域在花括号内。x的生命周期将是程序作用域。

那么作用域意味着我可以在哪里实际使用变量?@geogeirimiciuc是的,块内的静态变量只能在块内访问,但其生命周期与程序的生命周期相关联。因此,如果变量有程序生命周期,为什么我以后不能使用它?Or如何在块外使用它?@GeorgeIrimiciuc:通过将其声明从大括号中取出来更改其作用域。是的,我只是认为static可以让我在大括号外使用它,但无法找出为什么它实际上不使用它。确实,生存期和作用域是不同的。可能是因为{int n;n=5;}为什么你需要在那里的括号?你在混合可见性/可访问性和寿命。(请在询问这类细节时选择C或C++中的一个。它们之间可能有细微的差别(或不太微妙)。@Sabiabi我想知道是否有一种方法可以将n与大括号一起使用。@Mat关于我的问题,有什么方法吗?在这个非常特殊的情况下,对于
n
非静态,我不这么认为。对于
n
静态,可能不在该范围内。在全局范围内,可以有。如果你想问一个关于这两种语言的问题(除非您谈论互操作或它们之间的差异,否则您不应该这样做),至少提供一个在两种语言中都“可信”的代码示例。这并不能真正回答其他问题。而且我不鼓励使用
system()
pause
也不是所有平台上都能找到的实用程序(仅限Win?).是的,但我正在寻找一种方法,在声明变量的括号外使用变量。我放置systempause只是为了测试程序:)作为@VictorZamanian,它并没有回答问题。他问“变量decorated static是否有程序作用域?如果没有,我如何在这个程序中使用n?”。他询问了有关static关键字的问题。是的,但我正在寻找一种方法,在声明变量的括号外使用变量。当您在函数中声明变量时,static关键字指定变量在调用该函数之间保持其状态。
可以修改static,使其值保持不变如果误解的人来自java世界到C++哦,那么内存位置永远不会被覆盖?
{int n;n=5;}