我不断得到错误:当我运行这段代码时,重新定义了“I”。对局部变量的误解 这是我从C++学习的书中的问题。它只是说:

我不断得到错误:当我运行这段代码时,重新定义了“I”。对局部变量的误解 这是我从C++学习的书中的问题。它只是说:,c++,C++,6.21-识别并纠正以下程序中的错误: void p(int i) { int i = 5; cout << "i is " << i << endl; } 我不确定这个代码有什么问题。我认为这可能与p的论点有关。当我试着在崇高的文本中构建它时,它说 错误:“i”的重新定义 如果有帮助的话,我们正在学习局部、静态和全局变量 谢谢 有两个相互冲突的i,因此该参数将始终被忽略 无论传递给函数的值是什么,此函数都将始终打印出i是5。通过声明in

6.21-识别并纠正以下程序中的错误:

void p(int i)

{
    int i = 5;
    cout << "i is " << i << endl;

}
我不确定这个代码有什么问题。我认为这可能与p的论点有关。当我试着在崇高的文本中构建它时,它说 错误:“i”的重新定义

如果有帮助的话,我们正在学习局部、静态和全局变量

谢谢

有两个相互冲突的i,因此该参数将始终被忽略

无论传递给函数的值是什么,此函数都将始终打印出i是5。

通过声明int i=5,您试图将一个新变量引入到一个范围中,该范围中已经有一个参数列表中具有该名称的变量。那是个错误

没有任何上下文都不可能任意修复函数,但您可以:

删除int i=5 删除参数inti 改名
该代码违反了C++11标准第四版2014-12-15和以前的版本,但这是我现成的版本。具体而言,第3.3.3节第2段规定:

函数参数名称的潜在范围(包括lambda声明符中出现的名称或函数定义8.4中的函数局部预定义变量)从其声明点开始。如果函数具有函数try块,则参数或函数局部预定义变量的潜在作用域将在最后一个关联处理程序的末尾结束,否则将在函数定义的最外层块的末尾结束。参数名称不得在函数定义的最外层块中重新声明,也不得在与函数try块关联的任何处理程序的最外层块中重新声明


最后一句陈述了要求

@Jongware谢谢!已编辑。请选择与您遇到的问题相关的有意义的标题。这使得问题更容易搜索,对其他用户更有用。以下代码中的“识别和更正错误”是非常通用的,并且没有提供与您遇到的问题相关的信息。@O'Brien是这样的,因为pint i将int i作为参数,但也将int i=5定义为局部变量,这就是冲突所在?gcc认为这是一个错误,没有警告变成错误,并且不会编译。至少在这种情况下,它不会打印任何内容。是什么决定为你编译的?-1:因为Alex说的原因,错了。这不是隐藏:您试图将一个新变量引入一个已经有一个同名变量的作用域。这是一个错误。@Lightness,我同意称之为阴影有点误导,因为阴影通常指重叠范围内的声明,这是允许的。FWIW,clang不称之为阴影:错误:对“I”的重新定义。我想不那么让人困惑了。这很有道理。谢谢