2014-07-18 171 views
2

考虑下面的代码片段同一个名字:变量在C for循环使用时++

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 
} 
+0

当然你需要在循环内部使用外部'u'?否则,有什么意义? –

+0

内部变量** u **将外部变量** u **隐藏在它们的作用域和内部作用域中,具体情况取决于情况是否可能以某种方式引用外部变量。 – NetVipeC

+0

如果我记得正确,它会起作用,但这是一种不好的做法,你几乎不需要这样做。 –

回答

1

这将适用于大多数编译器。但是,这通常不是一个好的做法,因为它可能导致程序员的困惑,特别是如果程序变得庞大。

+0

是的,有很多很长的调试会话支持它。 – NetVipeC

4

代码

double u = 5.0; 

环的内阴影将定义

double* u = new double [10]; 

之前向它提出的。
循环内的所有代码只看到double u。它的意图是编译好,除了为代码的未来维护者引入混淆之外,从语法的角度来看没有任何错误。


注:
如果你不使用double* u环路内,没有之前定义这个变量点。作为一条经验法则:

局部变量定义应该在它们的第一个使用点之前显得最近。


至于你编辑的问题:
是的,这会更清楚,在这个意义上,人们可以看到double* u;不应该delete[] u;后使用的打算。虽然它不安全,并且仍然令人困惑,如果没有立即在循环内找到double u;的阴影定义。

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

+0

说外'u'只在循环之前使用。如果我在循环之前移动'delete [] u;',它仍然会让代码的未来维护者感到困惑。 [**我编辑了问题来反映这个**] – krylov

+0

@krylov _'这对于未来的维护者来说仍然是令人困惑的......'我会说不。但恕我直言,最好将处理数组的代码完全分解为单独的函数,或者简单地使用不同的名称。 –

+0

Downvoters会介意解释在这个答案中应该改进什么,或者我在哪里陈述什么错误? –