在第一次使用之前声明变量有什么缺点?

问题描述 投票:0回答:5

我的编程理念之一是在第一次真正使用变量之前定义变量。例如定义变量“x”的方式,我通常不会写这样的代码:

var total =0;
var x;
for(int i=0;i<100000;i++)
{
   x = i;
   total += x;
} 

相反,我更喜欢这个:

var total = 0;
for(int i=0;i<100000;i++)
{
   var x = i;
   total = +x;
} 

这只是示例代码,不用关心代码的真正含义。

第二种方式有什么缺点?性能?

c# c++ c algorithm
5个回答
5
投票

不要为性能而烦恼,除非你真的真的需要(提示:99%的时间你都不需要)。

我通常的哲学(这已被《可读代码的艺术》等书籍所证实)是在尽可能小的范围内声明变量。原因是,就可读性和代码理解而言,您在任何时候必须考虑的变量越少越好。在较小的范围内定义变量肯定会有所帮助。

此外,很多时候,如果编译器能够确定(在您的示例中)将变量移到 for 循环之外,以节省每次迭代都必须创建/销毁它,不会改变结果,但会提高性能它会为你做的。这是不用担心性能的另一个原因,编译器通常比我们更聪明。


3
投票

不影响性能,只影响范围。您应该始终在可能的最内层范围内定义变量。这提高了程序的可读性。


0
投票

唯一的“缺点”是第二个版本需要编译器支持。旧的编译器需要知道函数(或其内部范围)将使用的所有变量,因此您必须在特殊部分(Pascal)或块的开头(C)声明变量。如今这并不是一个真正的问题 - C 是唯一一种不支持在任何地方声明变量并且仍在广泛使用的语言。

问题在于 C 是他们在学校和大学教授的最常见的第一语言。他们教你 C,并强迫你在块的开头声明所有变量。然后他们教你一种更现代的语言,因为你已经习惯在一开始就声明所有变量,所以他们需要教你不要这样做。

如果您的第一语言允许您在函数体的任何位置声明变量,那么您会本能地在使用它之前声明它,并且他们不需要告诉您提前声明变量是不好的,就像他们不需要一样告诉你用5公斤重的锤子砸你的电脑是不好的。


0
投票

像大多数人一样,我建议将变量保留在内部范围内,但也有例外 发生,我认为这就是您所寻求的。

C++ 可能具有昂贵的构造函数/析构函数时间,最好只支付一次,而不是 N 次。比较

void TestPrimacyOfNUnsignedLongs(int n) {
  PrimeList List();  // Makes a list of all unsigned long primes
  for (int i = 0; i<n; i++) {
    unsinged long x = random_ul();
    if (List.IsAPrime(x)) DoThis();
  }
}

void TestPrimacyOfNUnsignedLongs(int n) {
  for (int i = 0; i<n; i++) {
    PrimeList List(); // Makes a list of all unsigned long primes
    unsinged long lx = random_ul();
    if (List.IsAPrime(x)) DoThis();
  }
}

当然,我可以

List
放入
for
循环中,但运行时间成本很高。


-4
投票

将相同作用域的所有变量放在代码的同一位置可以更轻松地查看您拥有哪些变量以及其中的数据类型。您不必查看整个代码即可找到它。 x 变量有不同的范围。在第二个示例中,您将无法在循环外部使用 x 变量。

© www.soinside.com 2019 - 2024. All rights reserved.