我的一个编程理念是在第一次真正使用之前定义变量。例如,定义变量'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;
}
这只是一个示例代码,不关心代码的真正含义。
第二种方式有什么缺点?性能
答案 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变量。