【问题标题】:Variables with the same name when using for loop in C++在 C++ 中使用 for 循环时具有相同名称的变量
【发布时间】:2014-07-18 14:47:29
【问题描述】:

考虑以下代码sn-p:

unsigned int i;
double* u = new double [10];

for (i=0; i<10; i++)
{
    double u = 5.0;
    // Other code
}

delete[] u;

变量名 u 可以使用两次吗?还是对此不屑一顾?代码使用某些编译器会编译失败吗?

编辑:这样更好吗?还是对代码的未来维护者仍然感到困惑?

unsigned int i;
double* u = new double [10];
// Do stuff with u
delete[] u;

for (i=0; i<10; i++)
{
    double u = 5.0;
    // Other code
}

【问题讨论】:

  • 您确定需要在循环内使用外部u 吗?不然还有什么意义?
  • 内部变量 u 将外部变量 u 隐藏在它们的作用域和内部作用域中,具体取决于是否可以引用外部变量以某种方式变化。
  • 如果我没记错的话它会起作用,但这是一种不好的做法,你几乎不必这样做。
  • 这只是一个简单的例子。外层u不在循环内部使用,而是在循环之后使用。
  • @πάνταῥεῖ 为什么不呢?循环中u 的范围是从定义到循环底部。在该范围之外,外部的u 是可见的。

标签: c++ for-loop scope


【解决方案1】:

代码

double u = 5.0;

循环内部会影响定义

double* u = new double [10];

在此之前制作。
循环内的所有代码都只会看到double u。它意味着编译得很好,除了给未来的代码维护者带来混乱之外,从句法的角度来看也没有错。


注意:
如果你没有在循环内使用double* u,那么在它之前定义这个变量是没有意义的。根据经验:

局部变量定义应该在它们的第一个使用点之前出现。


至于您编辑的问题:
是的,这会更清楚,因为人们可以看到不应该在delete[] u; 之后使用意图double* u;。虽然它既不安全,而且仍然令人困惑,但如果没有立即发现循环内 double u; 的阴影定义。

恕我直言,为了不混淆任何人,整体更好的解决方案是将循环中的代码或处理 double* u 的代码分解为单独的函数,或者甚至简单地使用不同的变量名。

【讨论】:

  • 说外层u只在循环之前使用。如果我在循环之前移动delete[] u;,是否仍然会让代码的未来维护者感到困惑。 [我编辑了问题以反映这一点]
  • @krylov '对于未来的维护者来说,这是否仍然令人困惑......'我会说不。但是恕我直言,最好将处理数组的代码完全分解为一个单独的函数,或者干脆使用不同的名称。
  • 投反对票的人是否介意解释一下这个答案中应该改进什么,或者我在哪里说错了?
  • @krylov 顺便说一句,您无需向我大喊您的编辑。我老了,但到目前为止既不是瞎子也不是聋子:P ...
【解决方案2】:

这适用于大多数编译器。但是,这通常不是一个好的做法,因为它可能会导致程序员的混乱,尤其是在程序变大的情况下。

【讨论】:

  • 是的,有很多长时间的调试会话支持这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多