Linux C 编程学习第三天_局部变量和全局变量

没想到距离上一次断接了这么久,切记要规范作息啊,回到正题

局部变量和全局变量

局部变量看字面意思就是在局部的变量,在函数中定义的变量称为局部变量,在一个函数中定义的变量,是无法在另一个函数中使用的,这应该很好理解

局部变量在每次函数调用时分配存储空间,在每次函数返回的时候释放存储空间,由于C99更新的特性,我们在函数中使用变量,只需要先声明就行,不必可以放在最前面,但是介于美观和可读性,还是写在前面好些吧。

接着是全局变量,我们通常会在 main() 函数前声明一些变量,多半是很多函数都会使用到,或者是一些标指或者使能的变量,它们就是全局变量,定义在所有函数体之外,是在程序开始运行时分配存储空间,在程序结束时才释放,并且在任何函数中都可以使用和更改它们。

由于这一特性,全局变量的值会不断被各个函数所更改,如果代码量很大,很有可能会在某处被无意间更改,导致整体无法正常,这个时候一定要慎用全局变量,如果出现了上述方法,不要着急,调试时将这个变量可视化,然后一步一步运行代码,当他发生你觉得不正确的改变时,好好检查,是可以解决问题的。

那么在所有函数前先定义了一个全局变量,但是在某个函数中忘记了,又定义了一个同名字的(局部)变量,这个时候会发生什么呢?

 

 看到这样的结果,会不会觉得,是  i  在main函数中重新定义赋值了,所以值成了3,真的是这样吗?

更改一下代码:

 

 欸?明明在main函数前,将 i 改变了,并且也输出了3,为什么在接下来的  printf_i();   函数输出的却还是2?

第一次打印的 i 是局部变量的值,第二次通过 printf_i();  函数输出的值是全局变量的值,也就是说,此 i 非彼 i 

全局变量是定义在所有函数体之外的,而main函数中定义的变量仅限于main函数中,是个局部变量, printf_i();  是无法读取的,换一种说法就是,main函数中的 i 的作用域只有main函数中,而全局 i 的作用域是整个源文件了。

 接着需要注意二者不同的问题来了:局部变量可以使用类型相符合的任意表达式来初始化,而全局变量只能用常量表达式

例如:

 

 如果改成这样就出错啦:

 

 程序在最开始需要使用适当的值来初始化全局变量,所有初始值必须保存在编译生成的可执行文件中,也就是说,在编译时就要计算出来,但是上述必须要通过调用add2th函数才能算出值,所有不能作为初始化全局变量的初始值。

另外全局变量在定义时不初始化,那么它的值为0,如果局部变量在定义是不初始化的话,值是不确定的,所有引入所有变量前一定要进行赋值,否则有可能发生奇怪的bug也说不定

 

接着说道一种新写法,函数声明可以下载局部作用域中,当然,该函数也只能在这个局部作用域中使用:

 

 如果在 printf_i()  中调用 add2th() 函数,会报错函数为声明:

 

 但是我们应该避免这种将函数写在main函数后的这种写法,还有,虽然这样写可以正确运行,但是不能在一个函数中定义一个新函数,最好还是极力避免这样的写法。

 

posted @ 2021-05-12 21:49  哿与银冰  阅读(400)  评论(0)    收藏  举报