C++ 变量范围

C++ 变量范围,c++,c,C++,C,假设 现在,我不能在其块的大括号后引用“a”。我想知道控件何时向上移动到第一个大括号,然后再向下移动到第三个大括号,将再次声明“a”或“a”保持值5。将在循环的每个步骤中定义一个新的A变量。将在循环的每个步骤中定义一个新的A变量。A仅在您声明它时才会被声明 您在内部作用域中声明了它,因此任何引用a的代码都只在同一作用域中有效。一旦你离开这个范围,你的程序中就再也没有所谓的“a”了。用于保存值5的内存现在可能会被程序的其余部分用于其他目的。a仅在您声明它时才会被声明 while(1) {

假设


现在,我不能在其块的大括号后引用“a”。我想知道控件何时向上移动到第一个大括号,然后再向下移动到第三个大括号,将再次声明“a”或“a”保持值5。

将在循环的每个步骤中定义一个新的
A
变量。

将在循环的每个步骤中定义一个新的
A
变量。

A
仅在您声明它时才会被声明


您在内部作用域中声明了它,因此任何引用
a
的代码都只在同一作用域中有效。一旦你离开这个范围,你的程序中就再也没有所谓的“a”了。用于保存值5的内存现在可能会被程序的其余部分用于其他目的。

a
仅在您声明它时才会被声明

while(1)
{
    {

        {
            int a=10;

            a=5;
        }

    }
}

您在内部作用域中声明了它,因此任何引用
a
的代码都只在同一作用域中有效。一旦你离开这个范围,你的程序中就再也没有所谓的“a”了。用于保存值5的内存现在可能会被程序的其余部分用于其他目的。

每次迭代时,该变量将在堆栈上重新分配逻辑上的位置——实际上,内存位置将被重复使用。但是请注意,在您的简单示例中,当循环在下一次迭代中返回到声明时,“a”的值永远不会“明显地”保持“5”的值,因为它在声明时被显式初始化为“10”。如果C#遵循与Java相同的实践,那么如果编译器没有首先抱怨如果您不亲自初始化未初始化的变量,那么它将被隐式地重新初始化为默认值。

该变量将在每次迭代时逻辑上重新分配到堆栈上——实际上,内存位置将被简单地重用。但是请注意,在您的简单示例中,当循环在下一次迭代中返回到声明时,“a”的值永远不会“明显地”保持“5”的值,因为它在声明时被显式初始化为“10”。如果C#遵循与Java相同的实践,如果编译器没有首先抱怨如果您不自己初始化未初始化的变量,则它将被隐式地重新初始化为默认值。

每次迭代while循环时,您将定义新的变量a和“a”的值也可以更改,但如果您以任何方式循环finish,您将丢失此变量(即使在同一函数中也不能使用它)

while循环的每次迭代,您将定义新变量a和“a”的值也将更改,但如果您以任何方式循环完成,您将丢失此变量(即使在同一函数中也不能使用它)

将再次声明a

while(1)
{
    {

        {
            int a=10;

            a=5;
        }

    }
}
通常,如果您确实希望参数重置每个循环,那么您将在循环中将参数定义为
a
,这样您就不会在迭代之间携带值

while(1)
{
    {

        {// Here Scope Starts
            int a=10;      

            a=5;
        }// Here Scope Ends

    }
}
但是,如果希望对所有迭代使用相同的参数和值,则需要在循环外定义它:

while(1)
{
    {
        {
            //Define a new `a`
            int a=10;
            a=5;
        }
    }
}

a将再次声明

通常,如果您确实希望参数重置每个循环,那么您将在循环中将参数定义为
a
,这样您就不会在迭代之间携带值

while(1)
{
    {

        {// Here Scope Starts
            int a=10;      

            a=5;
        }// Here Scope Ends

    }
}
但是,如果希望对所有迭代使用相同的参数和值,则需要在循环外定义它:

while(1)
{
    {
        {
            //Define a new `a`
            int a=10;
            a=5;
        }
    }
}

从逻辑上讲,
a
不能在其声明之前引用,也不能在其声明的大括号对关闭之后引用。它在结束时也会被破坏,但这是整数的否定。 每次循环时,它都将被重新初始化为10

但是,您错过了问题的有趣部分,即如果声明没有设置值会发生什么:

int a=0;
while(1)
{
    {
        {
            //`a` will count the number of iterations.
            a = a + 1;
        }
    }
}

在这里,
a
在第一次设置之前将是未定义的。但是,它也几乎总是在堆栈上的相同位置,因此,如果没有其他任何东西使用该空间,它可能会在一次迭代到下一次迭代中保留值。但它是否执行可能取决于执行情况,这使得它成为令人兴奋的bug来源

从逻辑上讲,
a
不能在其声明之前引用,也不能在其声明的大括号对关闭之后引用。它在结束时也会被破坏,但这是整数的否定。 每次循环时,它都将被重新初始化为10

但是,您错过了问题的有趣部分,即如果声明没有设置值会发生什么:

int a=0;
while(1)
{
    {
        {
            //`a` will count the number of iterations.
            a = a + 1;
        }
    }
}

在这里,
a
在第一次设置之前将是未定义的。但是,它也几乎总是在堆栈上的相同位置,因此,如果没有其他任何东西使用该空间,它可能会在一次迭代到下一次迭代中保留值。但它是否执行可能取决于执行情况,这使得它成为令人兴奋的bug来源

应该很容易尝试,对吧?稍微改变以避免无限循环:应该很容易尝试,对吗?为了避免无限循环,稍微做了一些修改:你是说“定义的”?:)定义可能是一个糟糕的词语选择,实例化可能更好?无论如何,该变量将被重新初始化,并且可能位于不同的位置,并且可能与最近的时间几乎没有任何关系。您的意思是“已定义”?:)定义可能是一个糟糕的词语选择,实例化可能更好?无论如何,变量将被重新初始化,并且可能位于不同的位置,并且可能与最近的时间几乎没有任何关系。请您详细说明您的最后一行回答,如果关闭大括号后但仍在while内的代码包含类似于
if(test){int j=3;…}
那么可能是
j
a
共享一个内存位置,但j只在某些过程中设置,因此
a
有时会保留其值,有时不会。如果测试很少,这将导致
a
在循环之间保持稳定,而