【发布时间】:2026-02-21 10:25:01
【问题描述】:
我注意到for 循环的范围规则对于 C 和 C++ 是不同的。
例如,下面的代码在 C 编译器中是合法的,但在 C++ 编译器中是不合法的。
for (int i = 0; i < 10; ++i) {
int i = 5;
}
以上代码在 C 中有效,但在 C++ 中出现重新定义错误。
我的猜测是 C 编译器将循环视为循环内有另一个作用域,如下所示。
for (int i = 0; i < 10; ++i) {
{
int i = 5;
}
}
为什么 C 编译器允许在循环范围内定义第二个同名变量?这样做有什么特别的理由或优势吗?
【问题讨论】:
-
你有用例吗?能够做到这一点似乎很容易引起错误。这也许就是 C++ 选择不支持它的原因。
-
在编译 C 和 C++ 时我会添加
-Wshadow -Werror -
所有 C++ 标准,在与
for语句有关的部分中,都有一个子句要求 for-init-statement (@987654326) 中的所有变量的范围@ 在您的示例中)以扩展到for语句的末尾。这可以防止在for语句中再次声明这些变量。所有 C 标准都没有等效子句(在与for语句相关的部分或其他任何地方) - 它允许(不阻止)在for循环的块中重新声明变量。一种或另一种方法是否具有优势 - 这是一个见仁见智的问题。 -
@AntonioVázquezBlanco:我很确定这在所有 C 标准中是一致的,在所有 C++ 标准中都是一致的,但在 C 和 C++ 之间是不同的。 C 和 C++ 之间的这种变化是可能的,因为它是在 C++ 标准化的早期引入的
-
我认为这只是由于语言发展的历史。有时,有人想“嘿,如果我们可以在
for语句中声明新变量,就在我们需要它们的地方,并且它们的范围以语句结束,这样以后就不会意外地使用它们,那就太好了。”然后人们开始使用它。但是在循环中声明相同的名称没有限制,有时人们会意外地这样做,即使他们不想这样做,也会将声明隐藏在for中。所以C++添加了禁止重新声明的规则……