c++ - C++中使用for循环时的同名变量

标签 c++ for-loop scope

考虑以下代码片段:

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

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

delete[] u;

可以使用变量名 u 两次吗?或者这是令人皱眉的?使用某些编译器会无法编译代码吗?

编辑:这样更好吗?或者对于代码的 future 维护者来说仍然感到困惑?

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
}

最佳答案

代码

double u = 5.0;

循环内部将遮蔽定义

double* u = new double [10];

在此之前制作。
循环内的所有代码都只会看到double u。它的目的是可以很好地编译,除了给 future 的代码维护者带来困惑之外,从语法的角度来看没有任何问题。


注意:
如果您不在循环内使用 double* u,则在其之前定义此变量是没有意义的。根据经验:

Local variable definitions should appear nearest before their first point of usage.


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

恕我直言,为了不让任何人感到困惑,整体上更好的解决方案是将循环中的代码分解出来,或者将处理 double* u 的代码分解为一个单独的函数,甚至简单地使用不同的变量名称。

关于c++ - C++中使用for循环时的同名变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24827823/

相关文章:

c++ - 代码行 1 中的 '(void)' 有什么用?

php - 如何在 PHP 中用 for 循环遍历以 0 开头的数字?

java - 对数等for循环转换为求和表示法

javascript - 未为立即调用的函数提升 const 变量

C++ 类变量析构函数

c++ - 为什么这个 boost 变换操作会把第二个元素弄错?

c++ - 检查内存泄漏

c++ - 在 C++ 中是否允许从括号值列表中赋值 std::array?

python - 如果条件为 False,则重新启动循环并编辑原始列表

oop - 过程式编程比面向对象编程有什么优势吗?