如果变量重复并声明一次,那么将变量从方法中取出是一种好习惯吗? (C郎)

Is that a good practice to take the variable out of methods if it is repeating and declare it once? (C lang)

我想知道如果我有一个变量在不同的方法中用于相同的目的,我应该声明一次变量并在不同的方法中或在每个方法中使用它吗?我正在用 C 编程,目前正在做文件管理器。

示例:

FILE *fp 
void deleteLine(){
 fp = fopen("name.txt", "w+");
 ...
 fclose(fp);
}

void insertLine(){
 fp = fopen("name2.txt", "w+");
 ..
 fclose(fp)
}

示例:

void deleteLine(){
 FILE *fp
 fp = fopen("name.txt", "w+");
 ...
 fclose(fp);
}

void insertLine(){
 FILE *fp
 fp = fopen("name2.txt", "w+");
 ..
 fclose(fp)
}

一般来说,建议在需要的范围内声明一个变量。在你的情况下,一个函数。 像您的示例中那样拥有一个副本可能会节省内存,但它可能会产生意想不到的副作用。 例如,当您退出该函数时,指针仍然指向一个非长期相关的内存。

简短回答:不,仅仅因为它“重复”就将变量移出函数不是一个好习惯。

一旦您学习了一种语言的语法并超越了微小的演示程序,计算机编程的大部分任务就变成了管理复杂性。管理复杂性的最重要工具之一是模块化,它使事情本地化。

因此,仅出于这个原因,并且作为一般规则,局部变量是一件非常好的事情,而全局变量通常是一件坏事。仅当您确实需要时才使用全局变量,当它们的使用带来明显的好处时,当没有其他好方法来完成您的任务时。

在这种情况下,如果您在两个不同的函数中有两个不同的局部变量,但它们或多或少地做着相同的事情,那确实是:完全没有问题。例如,同样的论点也适用于用作循环计数器的名为 i 的局部变量。

有时似乎有一种保持事物“整洁”的动力。而且我可以看到如何在源文件的顶部声明一个 FILE *fp,而不是在每个函数中冗余声明,这可能看起来“更整洁”。但实际上,那种“整洁”并不能给你带来任何好处。

一个相关示例涉及在同一行上声明多个变量。一些程序员认为(或被教导)他们应该一起声明很多变量,按类型分组:

int i, number_of_whales;
double ocean_depth, water_density, temperature_in_tokyo;
float whale_weights[100];

但是这个组织虽然看起来漂亮且“整洁”,但最终没有任何实际用途,甚至可能成为实际障碍。编译器不关心你如何声明你的变量。但是您和阅读您程序的其他人确实如此,所以问题是,是什么让 他们 的事情变得更容易?答案是您希望以一些有用的顺序声明您的变量:按字母顺序,或按相关用途分组,或以与它们使用相同的顺序。但是按 type 将它们组合在一起并没有让任何人都变得更容易。 (我知道这不是你问的问题,但它表达了相同的观点:我们不关心看起来[=44​​=]整洁,或者看起来 整洁,我们真正关心的是什么让我们的程序更容易理解和管理。)

关于全局变量要记住的另一件事是,它们是 global。如果随着程序的增长、改进和添加功能,insertline 函数最终调用了某个其他函数,而这个函数又调用了另一个函数,而另一个函数又调用了 deleteline,会发生什么情况?如果 deletelineinsertline 共享一个全局 fp 变量,那么当控制流返回到 insertline 时,它的 fp 就会被弄乱。 (这不是一个很好的例子,因为很难想象 insertline 曾经调用过 deleteline,如果它调用过,可能还会有其他问题。但我希望你明白我的意思。 )