局部变量和全局变量
变量起作用的范围受到限制---作用范围,作用域;因为分配类型空间时就不一样,形式参数在调用函数时分配,而实际参数在main函数中分配空间
变量的作用域及分类
变量按作用域分为:
1 局部变量
只在本函数内才能使用
在复合语句中定义的变量只在本复合语句范围内有效
作用域是从定义的位置起到函数体或者复合语句的结束,形参也是局部变量
2 全局变量
函数外定义的变量是外部变量,其有效范围从定义变量的位置开始到本原文件结束
全局变量从定义开始到源文件结束
变量名相同时,局部更优先
局部变量名字与全局变量相同时,顾及局部变量,全局变量被屏蔽
全局参数可以通过局部参数之间的参数传递得到
当想同时返回两个返回值时,可以通过全局变量实现
int min;
int max(int x,int y)
{
int z;
min=(x<y)?x:y;
z=(x>y)?x:y;
return z;
}
返回值为最大值,而因为定义了全局变量min,因此该程序结束后min值仍然为最小值,相当于实现两个返回值
但全局变量一旦出现,逻辑问题出现混乱,风格不好,不提倡
要限制使用全局变量
1 空间效率低:全部执行过程中占用存储空间
2 高耦合:易发生变量重名冲突,使得函数的可靠性和通用性降低
3 可读性低:降低程序清晰性,且各个函数执行时都可能改变全局变量的值
设计原则:高内聚 ,低耦合
计算机运行中的内存管理:
外存:程序文件
内存:程序区+数据区(静态存储区+动态存储区)
程序区:存放程序代码
静态存储区:全局变量+静态局部变量,整个程序结束后再失效(可一直存放变量,但浪费空间)
动态存储区:动态局部变量,作用范围结束后继续消失(用的时候再分配)
动态局部变量:1 函数形式参数
2 函数中的自动变量
3 函数调用中的现场保护和返回地址
四种存储类别:
1 自动变量:动态存储区中 auto int a;
Auto是默认的存储类别,相当于int a;
2 指定局部变量:为静态局部变量,值在函数调用结束后不消失,保留原值,占用存储空间不释放,下一次调用时保留上次函数调用的结果
. static int c;
局部静态变量的应用场合
需要保留函数上一次调用结束时的值
(可以统计循环次数)
静态存储多占内存,降低程序可读性,除非必要不使用
3 寄存器变量:直接放在cpu中的寄存器内,需要用时直接从寄存器取出参加运算,不必去内存中存取,提高执行效率
. register int i;
4 用extern声明外部变量:一个文件内声明全局变量
int max(int,int);
void main()
{extern int a,b; a,b的作用范围包括main函数,因为本来全局变量a,b的作用范围不包括main函数
cout<<max(a,b)<<endl;
}
int a=15,b=-7;
int max(int x,int y)
{int z;
z=x>y?x:y;
return z;
}
也可以直接将inta,b;直接提到main函数前面,就不再需要extern声明
建立一个多程序的文件
如果一个全局变量在某一个cpp文件中定义,则同一工程中其他cpp文件需要使用时可以用extern声明
用extern声明外部变量:使用其他文件中声明的外部变量
1 为程序设计带来方便
2 执行一个文件中的函数时,可能会改变全局变量的值,从而影响另一个文件中函数的执行结果,慎重使用!!!
用static声明静态外部变量:限制本文件外使用
1 全局变量加static声明使得该变量只限于被本文件引用,而不能被其他文件引用
2 静态外部变量只能用于本文件的外部变量即全局变量
一个工程里只能有1个main函数
关于变量的声明和定义
声明部分出现的变量:
定义性声明:简称定义,需要建立存储空间
引用性声明:不需要建立存储空间,如:extern int a;
系统根据变量的定义分配存储单元,对外部变量的初始化只能在定义时进行,而不能在声明中进行
内部函数:一个函数只能被本文件中其他函数所调用,又称静态函数
定义内部函数时,在函数名和函数类型前面加static,
例:static int fun(int a, int b)
变量默认只能在本文件中使用,函数默认在一个工程中所有文件中使用
因此,变量加extern,函数加static不允许其他文件使用
系统函数:数学函数:cmath
时间函数:ctime
随机数函数:cstdlib
例:产生10个0--5对的随机数
#include <iostream>
#include <ctime>
using namespace std;
int main(void)
{int i,ran_num;
srand(time(0)); 初始化随机数发生器,time(0)返回值做种子
for (i=0;i<10;i++)
{
ran_num=rand()%6; int rand()产生一个0到rand_max的整型随机数并返回,返
回值对6取余保证随机数为0--5
cout<<ran_num<<" ";
}
return 0;
}
变量属性
用static声明变量的作用:
1 对局部变量,使存储期为程序的全过程
2 对全局变量,该变量的作用域只限于本文件模块(即被声明的文件中)
预处理命令:以符号#靠头,且末尾不包含分号
1 对程序进行编译之前,根据预处理命令对程序做相应处理
2 经过预处理后编译程序才可以对程序进行编译等处理,得到可供执行的目标代码
编译预处理:.cpp-->.obj
C++提供的预处理主要功能:
1 宏定义
#define PI 3.1415926
Const (定义了常量类型,更加精确)
#define 标识符 字符串
带参数的宏定义:#define 宏名(参数表)字符串
例:#define S(a,b)a*b;即将S(a,b)替换为a*b
若area=S(3+1,2+4), 则area=3+1*2+4;结果出错
因此宏定义的参数替换是原样替换(机械替换,不管运算规则),某些情况下不方便,可更改为(a)*(b)
最好用内置函数inline
#define主要用于条件编译中
2 文件包含
一个源文件可以将另外一个源文件的全部内容包含进去
#include<头文件>
系统到系统目录中寻找包含的文件,系统提供的头文件宜采用,效率高
#include“文件名”
系统先到当前文件夹中查找,若找不到再到系统目录中寻找,系统文件和用户自己编写的文件都可以采用,一般用户自己编写文件时采用
3 条件编译