C++中的变量名称不明确

Variables names ambiguity in C++

本文关键字:不明确 变量名 C++      更新时间:2023-10-16

我对这种情况有点困惑:

#include <iostream>
void function(int origin)
{
if (origin < 0)
{
double origin = 0.3;
std::cout << origin << std::endl;
}
}
int main()
{
function(-4);
}

在v120工具集下使用VS2013成功编译并运行。这不是错误的C++吗因为做同样的事情,但只是在函数的开头,它会产生编译时错误。

根据C++标准第3.3.3.1节:,这是合法的

块中声明的名称是该块的本地名称;它具有块范围。它的潜在作用域从声明点开始,到块的末尾结束。在块范围内声明的变量是局部变量。

这样的重新声明会隐藏origin参数。

因为做同样的事情,但只是在函数的开头,它会产生编译时错误。

您会得到一个错误,因为C++标准在第3.3.3.2:节中明确禁止这样的重新声明

参数名称不应在函数定义的最外层块中重新声明,也不应在与函数try块关联的任何处理程序的最外层区块中重新声明。

排除的原因是函数参数是函数外部作用域的本地参数,因此在没有另一层大括号的情况下进行重新声明会在同一作用域中引入重复的标识符。

我不介意这种C++行为。当然,正如您所展示的,它可能会导致错误/疏忽。但你可以在C++中做到这一点

for (int i = 0; i < 4; ++i) {
for (int i = 0; i < 5; ++i) {
cout << i;
}
cout << i;
}
cout << endl;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 5; ++j) {
cout << j;
}
cout << i;
}

并且由于CCD_ 2在内部CCD_。

在像C#这样的其他语言中,你不能这样做。它将告诉您已尝试在内部作用域中重新声明一个同名变量。

我觉得这太保护了。当我剪切和粘贴带有循环的代码时,必须将我们都倾向于用作循环变量的i重新声明为i1i2等,这是令人恼火的。我总是错过一个,剪切和粘贴代码,所以我在i3循环中使用arr[i],而我指的是arr[i3](哇)。

在生产代码中,我同意防御性编码意味着您应该在同一函数中为循环变量使用不同的名称。

但是,当您进行实验时,能够在嵌套for循环中重用变量名是很好的。C++给了你这样的选择。

这不是错误的C++吗?

否。重新声明标识符是完全合法的,只要它在不同的范围内。在这种情况下,作用域是if语句的then主体。

这并不含糊。将使用最接近的先前声明。

不,没有错。根据标准,这是一种完全有效的行为。

void function(int origin)
{
if (origin < 0) // scope of the first 'origin'
{
double origin = 0.3; // scope of the second 'origin' begins
// scope of the first 'origin' is interrupted
std::cout << origin << std::endl;
} //block ends, scope of the second 'origin' ends
//scope of the first 'origin' resumes
}

正如tupe_cat所说,如果它们的作用域不同,那么重新声明总是有效的。在这种情况下,属于内部范围的变量将超过外部范围。