第三十节 变量的生命周期 《道德经》第七章有云:天地所以能长且久者,以其不自生,故能长生。是以圣人後其身而身先,外其身而身存。非以其无私耶?故能成其私。老子告诉我们,万事万物都有生命周期,所以C语言中的变量是有生命周期,有生有死。 我们先来看下这个程序: int main(int argc, char* argv[]) { for (int i = 0; i < 10; i++) { ; } for (int i = 0; i < 10; i++) { ; } return 0; } 在main函数中出现了两次i,但是这两者互不影响,原因在于当每个for循环结束之后,i的生命周期也就完结。但是笔者不提倡这种代码风格,因为变量i隐含在了执行程序中,无论是代码的阅读和维护都有较大的困难,因此工程项目中不建议使用该语法。如果程序代码,不是为了方便别人阅读而写的,而是仅仅自己能够阅读,那么再漂亮的代码也终将石沉大海。读者千万要牢记:只有自己才能读得懂的代码,是没有使用价值的。 因此笔者建议将上述代码写成: int main(int argc, char* argv[]) { int i = 0; int j = 0; for (i = 0; i < 10; i++) { ; } for (j = 0; j < 10; j++) { ; } return 0; } 有效区域、生命周期、作用域,这三者或多或少是相互依赖,对于变量的作用域,笔者给大家举一个列子,相信你马上就会明白。 int i = 1; int main(int argc, char* argv[]) { printf("i = %d n", i); for (i = 0; i < 3; i ++) { printf("i = %d n", i); int i = 10; printf("i = %d n", i); } printf("i = %d n", i); return 0; } 我想很多读者看到这个程序,第一反应应该是难道不会报错。是的,不会报错。我们先来见证下奇迹的时刻,输出为: i = 1 i = 0 i = 10 i = 1 i = 10 i = 2 i = 10 i = 3 请按任意键继续. . . 我们来分析一下,程序定义了一个全局变量i,并且赋值为1,进入main()之后,输出,即为此刻为1的i。OK,紧接着进入for循环,此刻重新对全局变量赋值为0,此刻输出为0的全局变量i的值;接着重定义一个局部变量i,并且赋值为10,此刻输出即为局部变量为10的i的值。循环3次之后,此刻全局变量为3,最后将其输出。从这个程序可以看出,全局变量i的作用域是整个程序,而在for循环内局部变量i的作用域仅仅是在for循环内。
|