缺点是在第一次使用变量之前声明变量
What downsides is declaring variables just before first time use it?
我的编程理念之一是在第一次真正使用变量之前定义变量。例如,定义变量"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变量。
- 在将变量声明为引用时,堆在释放后使用
- 静态变量声明和定义
- 在变量声明中使用 for 循环
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- C++ 类型类的变量声明不命名类型?
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- std::enable_if 更改成员 *变量* 声明/类型
- 在C++中,变量声明左侧的大括号是什么意思?
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 命名空间内C++变量声明
- 将静态全局变量声明为内联有什么意义吗?
- 如何将一个变量声明为另一个变量的值
- 如何将迭代器变量声明为私有成员变量
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- ClangTool 如何获取变量声明中模板参数的位置?
- 标准与显式自动推导变量声明
- C 静态变量声明怪异链接器错误
- 如何为数组成员变量声明 getter/setter
- 可视C++变量声明