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
在循环之间保持稳定,而