1

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

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

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

4

5 回答 5

4

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

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

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

于 2013-06-30T01:59:30.167 回答
3

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

于 2013-06-30T01:47:37.540 回答
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();
  }
}

当然,我可以放入循环Listfor,但运行时间成本很高。

于 2013-06-30T04:23:33.720 回答
0

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

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

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

于 2013-06-30T02:05:22.033 回答
-4

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

于 2013-06-30T01:44:21.820 回答