缺点是在第一次使用变量之前声明变量

What downsides is declaring variables just before first time use it?

本文关键字:变量 声明 第一次 缺点      更新时间:2023-10-16

我的编程理念之一是在第一次真正使用变量之前定义变量。例如,定义变量"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;
} 

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

第二种方式有什么缺点?表演

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

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

此外,通常情况下,如果编译器能够确定(在您的示例中)将变量移动到for循环之外,以避免每次迭代都必须创建/销毁它,这不会改变结果,但有助于性能,他会为您这样做。这也是不必担心性能的另一个原因,编译器通常比我们更聪明。

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

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

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

如果你的第一语言允许你在函数体的任何地方声明一个变量,你会在使用它之前本能地声明它,他们不需要告诉你事先声明变量是不好的,就像他们不需要说用5公斤重的锤子砸你的计算机是不好一样。

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

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();
  }
}

当然,I可以List放入for循环中,但要付出相当大的运行时间成本。

将同一范围的所有变量放在代码的同一位置,可以更容易地查看您拥有的变量和数据类型。您不必查看整个代码就能找到它。x变量有不同的作用域。在第二个示例中,您将无法在循环之外使用x变量。