在开始讲解函数之前,我们理解的变量就是在内存中开辟一个存储数据的位置,并给它起个名字,因为只有一个main函数,所以我们才对它的作用范围一无所知,觉得定义了变量就可以随时随地地使用它。学习函数之后发现不同的函数定义的变量,它们是无法相互进行访问的。
在上面的代码中func函数有一个参数,两个变量,他们的作用范围仅限于func函数的内部,在main函数中无法访问参数a以及变量b和c。同样在func函数中也无法访问在main函数里边定义的m和n两个变量。另外在func函数的内部还有一个复合语句(for语句以及其体内用大括号包裹的若干语句构成一个复合语句),在for语句的第一个表达式部分声明变量i(C99标准),它的作用范围仅限于复合语句的内部。
在main函数中定义了两次i变量,但编译器竟然通过了(在同一个函数中重复定义同名变量是不允许的),这是因为第二个变量i是定义于for语句构成的复合语句中,它的作用范围仅限于for循环体的内部,所以两者并不会发生冲突。
这里for语句因为定义了同名的i变量,所以它屏蔽了第一个定义的i变量。在for语句循环体重,无法直接访问到外边的i变量。C语言是允许在程序中“随处”声明变量的。允许变量在需要时才声明这是一个很棒的特性,因为当函数体非常庞大的时候没有人会愿意往前翻好几页的代码去看某个变量的注释。不用担心重复定义(编译器会找出重复定义的变量并且报错),所以只管使用就可以了全局变量在函数里面定义的变量称为局部变量;在函数外面定义的变量称为外部变量,也叫做全局变量,因为全局变量可以被本程序中其他函数所共用。
这个count 变量定义于函数之外,他就是全局变量。它的作用范围是整个程序,所以无论是main函数还是a,b,c函数,都可以对它进行访问和修改,这样一来,全局变量无疑就拓宽了函数之间交流的渠道。与局部变量不同,如果不对全局变量进行初始化,那么它会自动初始化为零。如果在函数的内部存在一个与全局变量同名的局部变量,编译器并不会报错,而是在函数中屏蔽全局变量(也就是说在这个函数中,同名局部变量将代替全局变量)
程序定义了a和b两个全局变量,其中a并没有对其进行初始化。进入main函数后,先打印a和b的值,发现a默认被初始化为零。接着调用func函数,恰好func函数中定义了于全局变量同名的局部变量b。由于出现了同名的局部变量,所以对应的全局变量b的值。最后回到main函数,打印的是两个全局变量的值,发生在func函数中对b进行修改,并不会影响全局变量的值。如果一个全局变量在函数定以后才被定义,编译器就会报错。
因为编译器对代码的解读是从上到下的,所以func函数中,没有发现前面有count函数的定义,就会报错‘count变量未定义’。对于这种情况,就可以在func函数中,用extern关键字对后面定义的count全局变量进行修饰。这样就相当于告诉编译器: 这个变量在后面才定义,先别急着报错。
不要大量使用全局变量
(1)使用全局变量会使程序占用更多的内存。因为全局变量从被定义开始,直到程序退出才被释放; 而局部变量是当函数调用完成即可释放。现在使用C语言开发,要么是非常的注重效率的驱动,底层开发,要么是嵌入式开发,都是“寸土寸金”的领域。等学到结构体,定义出来的变量可就不是只占用一点儿的空间。(2)污染命名空间。虽然局部变量会屏蔽全局变量,但是这样一来也会降低程序的可读性,往往很难一下子判断每个变量的含义和作用范围。(3)提高了程序的耦合性。使用全局变量会牵一发而动全身,时间久了,代码长了,连自己都不知道全局变量被哪些函数修改过。在模块化程序设计指导下应该尽量设计内聚性强,耦合性弱的模块,也就是要求函数的功能要尽量单一与其他函数的相互影响尽可能地少,而大量使用全局变量会正好相反。
在代码里右键那个全局变量,添加监视。默认情况下(VS2015)就可以在监视1的窗口里看到你刚才添加的变量了。
打开监视窗口的方法:调试
-
窗口
-
监视
-
监视1。
C++本来就有一个叫count的方法,因为是在std名空间里所以不会判定为冲突。但是编译器还是不能确定你到底是想用::count变量还是std::count函数。这个时候你只能写全名::count欢迎分享,转载请注明来源:内存溢出
评论列表(0条)