5

今日、驚くべきことに、次のコードが完全に有効であることを発見しました (gcc 4.4.5):

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

私は本当に驚いています。受け入れる必要がある場合は、新しい変数が独自のブロック内にあり、外部のコードの残りの部分が引き続きパラメーターにアクセスできるため、パラメーターが実際にはシャドウされていないため、それはある程度理にかなっていると言えます。しかし、それでも意味がわかりません。なぜこれを無効な構文にしなかったのですか? これを許可しても何のメリットもないと思います。実際、これによって引き起こされたバグを掘り下げる必要がありました。それは長い関数であり、パラメーターと同じ名前を持っていることに気付かずに独自の変数を作成しました。コードのいくつかの行 (同じブロック) は、まさにそのパラメーター変数に依存しており、今では私のバージョンを使用しています。そして、私の一日は1時間になります。

私はコンパイラについて非常に表面的な知識を持っているので、誰かがこの動作の背後にある完全なストーリーを説明してくれませんか? 比較として、このような Java コードでは無効です (重複変数)。

4

2 に答える 2

1

C++ でこれが許可されている理由を尋ねる場合、答えは簡単です。有効な C コードを受け入れるためです。

また、関連するスコープが名前空間、クラス、関数、またはブロック スコープであるかどうかを気にせずに、異なるスコープ内の同じ識別子の異なる意味をすべて同じ方法で処理するため、ルールがより単純になります。

于 2013-05-06T18:45:41.103 に答える
-4

変数ではなく参照を渡します。C++ プログラミング言語での Bjarne Stroustroup の引用- 「参照を使用して、引数の値を変更することになっている関数を実装できます」p.62

于 2013-05-06T18:36:03.370 に答える