好吧,我想知道为什么这段代码正常工作,我才意识到我在同一范围内有两个同名的变量.
我正在使用g ++(gcc 4.4).
for(int k = 0 ; k < n ; k++)
{
while(true)
{
i = Tools::randomInt(0, n);
bool exists = false;
for(int k = 0 ; k < p_new_solution_size ; k++)
if( i == p_new_solution[k] )
{
exists = true;
break;
}
if(!exists)
break;
}
p_new_solution[p_new_solution_size] = i;
p_new_solution_size++;
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 11
的k在内部for循环阴影(或隐藏)的k在外部for循环.
您可以在不同的范围内声明具有相同名称的多个变量.一个非常简单的例子如下:
int main()
{
int a; // 'a' refers to the int until it is shadowed or its block ends
{
float a; // 'a' refers to the float until the end of this block
} // 'a' now refers to the int again
}
Run Code Online (Sandbox Code Playgroud)
好吧,我想知道为什么这段代码有效,我刚刚意识到我在同一范围内有两个同名的变量。
您似乎对范围感到困惑。它们不是“在同一范围内”... for 循环的 k 有它自己的嵌套/内部范围。更重要的是,要了解语言允许这样做的原因,请考虑:
#define DO_SOMETHING \
do { for (int i = 1; i <= 2; ++i) std::cout << i << '\n'; } while (false)
void f()
{
for (int i = 1; i <= 10; ++i)
DO_SOMETHING();
}
Run Code Online (Sandbox Code Playgroud)
在这里,由宏“DO_SOMETHING”替换的文本在与 i 相同的范围内进行评估。如果您正在编写 DO_SOMETHING,您可能需要对其进行扩展以将某些内容存储在变量中,并确定标识符i- 显然您无法知道它是否已经存在于调用上下文中。您可以尝试选择一些更晦涩的东西,但是人们会使用如此复杂的变量名称,从而使他们的代码可维护性受到影响,并且无论迟早都会发生冲突。因此,该语言只是让内部作用域引入具有相同名称的变量:使用最内部的匹配,直到其作用域退出。
即使您不处理宏,也必须停下来思考某些外部作用域是否已经在使用相同的名称,这也是一件很痛苦的事情。如果您知道您只是想要一个快速操作,您可以将其弹出一个独立(嵌套)范围,而不考虑更大的上下文(只要您没有实际想要使用外部范围变量的代码:如果您这样做那么您有时可以显式指定它(如果它的范围受命名空间和类的限制,但如果它位于函数体中,您最终需要更改自己的循环变量的名称(或者在引入同名变量之前创建引用或其他内容)多变的))。