变量范围

时间:2013-12-11 07:38:50

标签: c++ c

假设

while(1)
{
    {

        {
            int a=10;

            a=5;
        }

    }
}

现在因为我不能参考" a"在它的阻挡之后。我想知道什么时候控制移动到第一个支撑,然后再次运行访问第三个支撑将" a"再次宣布或" a"保持价值5。

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

a只会在您声明时声明...

您在内部范围内声明了它,因此引用a的任何代码只能在同一范围内有效。离开该范围后,程序中不再存在任何名为“a”的内容。用于保存值5的内存现在可以由程序的其余部分用于其他目的。

答案 2 :(得分:1)

逻辑上,a无法在声明之前引用,或者在其声明的括号对关闭之后引用。它也会在结束时被破坏,但这是一个NOP的整数。 每次循环时,它都会重新初始化为10。

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

while(1)
{
        {
            int a;    // Here Scope Starts  

            a=5;
        }// Here Scope Ends
}

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

答案 3 :(得分:0)

while(1)
{
    {

        {// Here Scope Starts
            int a=10;      

            a=5;
        }// Here Scope Ends

    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

while循环的每次迭代,你将定义新变量a和“a”值的变化,但如果你以任何方式循环完成,你将失去这个变量(你甚至不能在同一个函数中使用它)!

答案 6 :(得分:0)

a将再次宣布。

通常你会在循环中将参数定义为a,如果你想让它重置每个循环,那么你就不会将值从迭代变为迭代。

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

但是如果你想为所有的迭代使用相同的参数和值,你需要在循环旁边定义它:

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