#include
using namespace std;
//全局变量
int global_value = 1;
void fun01()
{
int load_value = 1;
static int static_value = 1;
/*static作用:->与const混淆了,以为这是固定的
1、如果加了static,就会对其它源文件隐藏。
2、static的第二个作用是保持变量内容的持久
3、static的第三个作用是默认初始化为0
*/
cout << global_value << "\t" << load_value << "\t" << static_value << endl;
global_value += 1;
load_value += 1;
static_value += 1;
cout << endl;
}
int main()
{
while (global_value < 3)
{
fun01();
}
system("pause");
return 0;
}
//输出的结果:
1 1 1
2 1 2
叙谈全局与局部变量的区别:
(1)全局变量可被不同函数共同使用,增加了函数间的联系,降低了函数的独立性,导致函数不容易理解且难以重复函数使用。所以,一般情况下使用局部变量。
(2)全局变量可作为函数与函数之间的通信方式,但参数传递与返回值比全局变量更安全。
(3)同名的全局变量与局部变量:在局部变量的作用域内,全局变量被屏蔽,直接使用该名字,用的是局部变量,但可用::作用域运算符引用同名全局变量。
static的定义与用处:
用关键字static修饰的变量称为静态类型变量。静态变量
可以是局部的,也可以是全局的。静态变量具有全局寿命,即从程序启动开始到程序运行结束。
说明:
(1)尽管静态变量具有全局寿命,但在
其作用域外同样是不允许访问的。
(2) 静态类型变量均有确定的值。当说明静态类型变量时没有指定初始值则编译器将其初值置为0。静态变量仅初
始化一次。
(3)用static修饰的局部变量,系统采用
静态存储分配方式。 它的作用是用来保存函数运行后静态变量的结果以便
下次调用函数时能继续使用上次的结果。即调用函数执行完毕系统并未收回该变量所占空间。
在这里因为static可以是全局的,那和普通全局变量有什么区别?
相同点:1)共存于
同一块内存(静态存储区)中;
2)
生命期相同,都是整个程序的生命期;
不同点:1)前者是
内部连接,后者是
外部连接;
2)作用域不同:
前者的作用域是局部于它所在的文件的,也就是说在当前程序中其它文件中是不能使用它的,如果想在想其它文件中声明它为extern的来访问它,编译器就会报错,当然在其它文件中即使有同名的变量也不会有名字冲突的问题;
后者的作用域是
整个程序中的所有文件,可以在其它文件中声明它为extern来访问它,当然在整个程序中不论是否是同一个文件都不能有同名的普通全局变量,否则会有名字冲突,(如果在一个函数体内有与全局变量同名的局部变量,那么
局部变量会屏蔽全局变量,除非
使用作用域运算符:: )。
2、static局部变量和普通局部变量的区别:
相同点:作用域相同,都是局部于当前所在的函数体内。
不同点:
1)前者是内部连接,后者没有连接;
2)存储区域不同:前者存放于静态存储区,后者存放于栈中;
3)生命期不同:前者是整个程序的生命期,后者是所在函数的生命期(即随它所在的函数调用的结束而结束);
4)初始化:前者只在函数第一次被调用时初始化,当次调用时的变量值会保存到下次调用时使用,也就只初始化一次;后者则是在每次调用函数时都要重新创建它的存储空间,重新初始化一次,即调用一次函数初始化一次。
练习1:
#include
using namespace std;
int i = 120;
int fun()
{
static int i = 100;
return i++;
}
int main()
{
int x = 10;
fun(); //如果删去这一步,则输出100 120
cout << fun() << endl;
cout << i << endl;//输出的是全局变量!而不是静态局部变量
system("pause");
return 0;
}
输出结果:101 120
一开始认为:101 101——>认为fun()中的i为静态全局变量
阅读(3259) | 评论(0) | 转发(0) |