我一直在阅读C ++入门第5版。在第6.1章的函数参数列表的第三段中。 它写道“此外,函数最外层的局部变量可能不会使用与任何参数相同的名称”。 这是什么意思?
我不是英语母语人士。我不理解函数“最外层范围”的实际含义。
答案 0 :(得分:24)
函数的最外层是定义函数体的块。您可以将其他(内部)块放在其中,并在该块的本地变量中声明变量。内部块中的变量可以与外部块中的变量或函数参数具有相同的名称;他们将名称隐藏在外部范围内。外部块中的变量不能与函数参数同名。
演示:
void f(int a) // function has a parameter
{ // beginning of function scope
int b; // OK: local variable
{ // beginning of inner block
int a; // OK: hides parameter
int b; // OK: hides outer variable
} // end of inner block
int a; // Error: can't have same name as parameter
}
答案 1 :(得分:16)
这意味着你不能做这样的事情:
void foo (int x)
{
int x = 4; //in the outermost scope, invalid
}
但是,你可以这样做:
void foo (int x)
{
{ //this introduces a new scope
int x = 4; //not in the outermost scope, valid
}
}
答案 2 :(得分:7)
这意味着这是无效的:
void f(int p)
{
int p = 3;
}
此时
void f(int p)
{
{
int p = 3;
}
}
是允许的。
答案 3 :(得分:4)
此规则不仅适用于函数定义的函数参数,还适用于迭代和条件语句以及异常处理程序
3.3.3阻止范围
2函数参数名称的潜在范围(包括一个 出现在lambda声明符中)或函数本地预定义 函数定义(8.4)中的变量从它的角度开始 宣言。如果该函数具有函数 - 尝试阻止该电位 参数或函数本地预定义变量的范围结束 在最后一个关联的处理程序的末尾,否则它结束于 函数定义的最外面的块的结尾。一个参数 名称不得在函数的最外层重新声明 定义也不在与a关联的任何处理程序的最外面的块中 功能的try块。
3异常声明中声明的名称是本地的 处理程序,不得在最外面的块中重新声明 处理程序。
4在for-init语句中声明的名称,for-range-declaration, 并且在if,while,for和switch语句的条件下 if,while,for或switch语句的本地语句(包括 受控声明),不得在随后重新声明 该陈述的条件也不在最外面的块中(或者,对于if 声明,受控声明的任何最外面的块; 见6.4。
例如,此代码段无效
if( int x = SomeFunction() )
{
int x; // invalid declaration
//...
}
答案 4 :(得分:2)
想象一下,你有一个带有整数参数'bar'的函数'foo'。
int foo (int bar)
{
int bar = 0; // < illegal, this is the 'outermost' scope
if (bar == 10) {
int bar = 5; // legal (though unadvisable) this 'shadows' the passed-in 'bar'
return bar;
}
return bar;
}
'bar'的第一个内部声明是非法的,因为传入的参数也在同一个上下文中声明(即使语法不一定清楚。)
正如写作不正确:
int bar;
char bar[10];
由于这两个变量共享相同的范围。
bar的第二个声明(在上面的函数foo中)是合法的(虽然通常是一个坏主意)因为它是在'if'因此公平游戏的内部范围内声明的。
希望有所帮助。