5

我今天惊讶地发现以下代码是完全有效的(gcc 4.4.5):

int get_int(const int& i)
{
    if(i == 0)
    {
        int i = 1;
        return i;
    }
    return i;       
}

我真的很惊讶。如果我必须接受它,那么我可以肯定地说它是有道理的,因为新变量在它自己的块内,所以外面的其余代码仍然可以访问参数,所以参数并没有真正被隐藏。但这对我来说仍然没有意义,为什么我们不将其设为无效语法?我认为允许这样做没有任何好处,事实上,我只需要深入研究由此引起的错误。这是一个很长的函数,我创建了自己的变量,却没有意识到它与参数同名,后来的一些代码行(相同的块)依赖于那个参数变量,现在它正在使用我的版本我一天中有一个小时。

我对编译器有非常肤浅的了解,所以有人可以向我解释这种行为背后的全部故事吗?作为比较,在这样的 Java 代码中是无效的(重复变量)。

4

2 回答 2

1

如果你问为什么 C++ 允许这样做,答案很简单:为了接受有效的 C 代码。

它还使规则更简单,以相同的方式处理不同作用域中相同标识符的不同含义,而无需关心所涉及的作用域是命名空间、类、函数还是块作用域。

于 2013-05-06T18:45:41.103 回答
-4

您传递的不是变量而是引用。引用C++ 编程语言中的 Bjarne Stroustroup -“引用可用于实现应该更改其参数值的函数”第 62 页

于 2013-05-06T18:36:03.370 回答