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

时间:2013-06-30 01:40:34

标签: c# c++ c algorithm

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

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

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

5 个答案:

答案 0 :(得分:4)

除非你真的真的需要(暗示:99%的时间你不需要),否则不要打扰自己。

我的惯常理念(已经被“可读代码的艺术”等书籍所证实)是在尽可能小的范围内声明变量。原因在于,在可读性和代码理解方面,您在任何时候都要考虑的变量越少越好。在较小范围内定义变量肯定有助于此。

此外,通常情况下,如果编译器能够确定(在您的示例的情况下)将变量移出for循环以节省必须创建/销毁它,每次迭代都不会改变结果但会有所帮助表现他会为你做的。这是不打扰性能的另一个原因,编译器通常比我们更聪明。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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 :(得分:-4)

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