代码之家  ›  专栏  ›  技术社区  ›  Carlos

使用子作用域中使用的变量名[重复]

c#
  •  14
  • Carlos  · 技术社区  · 16 年前

    我一直在想,为什么在c中不允许使用以前在子作用域中使用的变量名。这样地:

    if (true)
    {
        int i = 1;
    }
    
    int i = 2;
    

    编译上述代码会产生错误:

    名为“i”的局部变量不能是 在此范围内声明,因为 会给“我”一个不同的含义, 已经用在“孩子”身上了 表示其他事物的范围

    但是您也不能使用在子作用域中定义的变量。上面的代码在Java中工作得很好,我看不出为什么它在C语言中也不工作。我肯定有很好的理由,但这是什么?

    4 回复  |  直到 11 年前
        1
  •  14
  •   Adam Crossland    16 年前

    这是C的设计师们做出的一个设计选择。它减少了潜在的模糊性。

    您可以在两个位置之一使用它,在if内部或外部,但您只能在一个位置定义它。否则,您会发现编译器错误。

        2
  •  3
  •   jeffmk    11 年前

    我注意到这里没有注意到的东西。这个 编译:

    for (int i = 0; i < 10; i++)
    {
        int a = i * 2;
    }
    for (int i = 0; i < 5; i++)
    {
        int b = i * 2;
    }
    

    综上所述,这些设计决策似乎不一致,或者至少奇怪地分别具有限制性和允许性。

        3
  •  1
  •   cwap    16 年前

    正如AdamCrossland所说,这是一个设计选择,旨在确保您(或者更可能是您的开发伙伴)不会误解代码。

    您经常看到私有实例成员的前缀是“m_u”或“uu”(例如,m_myvar或m_myvar),以避免混淆。

        4
  •  0
  •   Toad    16 年前

    很可能,在任何子作用域中创建的任何变量都将在输入矩方法时放在stackframe上。

    这样,子作用域中的类似名称就不能与另一个子作用域中的变量名称共存。

    如果他们愿意的话,他们当然可以解决这个问题,所以我想这最终也与设计有关。这样就减少了出错的机会