Lecture 4(下)

局部变量和全局变量

变量起作用的范围受到限制---作用范围,作用域;因为分配类型空间时就不一样,形式参数在调用函数时分配,而实际参数在main函数中分配空间

变量的作用域及分类

变量按作用域分为:

局部变量

只在本函数内才能使用

在复合语句中定义的变量只在本复合语句范围内有效

作用域是从定义的位置起到函数体或者复合语句的结束,形参也是局部变量

全局变量

函数外定义的变量是外部变量,其有效范围从定义变量的位置开始到本原文件结束

全局变量从定义开始到源文件结束

变量名相同时,局部更优先

局部变量名字与全局变量相同时,顾及局部变量,全局变量被屏蔽

全局参数可以通过局部参数之间的参数传递得到

当想同时返回两个返回值时,可以通过全局变量实现

int min;

int max(int x,int y)

{

int z;

min=(x<y)?x:y;

z=(x>y)?x:y;

return z;

}

返回值为最大值,而因为定义了全局变量min,因此该程序结束后min值仍然为最小值,相当于实现两个返回值

但全局变量一旦出现,逻辑问题出现混乱,风格不好,不提倡

要限制使用全局变量

空间效率低:全部执行过程中占用存储空间

高耦合:易发生变量重名冲突,使得函数的可靠性和通用性降低

可读性低:降低程序清晰性,且各个函数执行时都可能改变全局变量的值

设计原则:高内聚 ,低耦合

计算机运行中的内存管理:

外存:程序文件

内存:程序区+数据区(静态存储区+动态存储区)

程序区:存放程序代码

静态存储区:全局变量+静态局部变量,整个程序结束后再失效(可一直存放变量,但浪费空间)

动态存储区:动态局部变量,作用范围结束后继续消失(用的时候再分配)

动态局部变量:函数形式参数

              2 函数中的自动变量

              3 函数调用中的现场保护和返回地址

四种存储类别:

自动变量:动态存储区中  auto int a

Auto是默认的存储类别,相当于int a

指定局部变量:为静态局部变量,值在函数调用结束后不消失,保留原值,占用存储空间不释放,下一次调用时保留上次函数调用的结果

.   static int c

局部静态变量的应用场合

 需要保留函数上一次调用结束时的值

(可以统计循环次数)

静态存储多占内存,降低程序可读性,除非必要不使用

寄存器变量:直接放在cpu中的寄存器内,需要用时直接从寄存器取出参加运算,不必去内存中存取,提高执行效率

. register int i

extern声明外部变量:一个文件内声明全局变量

int max(int,int);

void main()

{extern int a,b;   ab的作用范围包括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声明外部变量:使用其他文件中声明的外部变量

为程序设计带来方便

执行一个文件中的函数时,可能会改变全局变量的值,从而影响另一个文件中函数的执行结果,慎重使用!!!

static声明静态外部变量:限制本文件外使用

全局变量加static声明使得该变量只限于被本文件引用,而不能被其他文件引用

静态外部变量只能用于本文件的外部变量即全局变量

一个工程里只能有1main函数

关于变量的声明和定义

声明部分出现的变量:

定义性声明:简称定义,需要建立存储空间

引用性声明:不需要建立存储空间,如:extern int a

系统根据变量的定义分配存储单元,对外部变量的初始化只能在定义时进行,而不能在声明中进行

内部函数:一个函数只能被本文件中其他函数所调用,又称静态函数

定义内部函数时,在函数名和函数类型前面加static

例:static int funint a, int b

变量默认只能在本文件中使用,函数默认在一个工程中所有文件中使用

因此,变量加extern,函数加static不允许其他文件使用

系统函数:数学函数:cmath

          时间函数:ctime

          随机数函数:cstdlib

例:产生100--5对的随机数

#include <iostream>

#include <ctime>

using namespace std;

int main(void)

{int i,ran_num;

srand(time(0));   初始化随机数发生器,time0)返回值做种子

for (i=0;i<10;i++)

{

ran_num=rand()%6;      int rand()产生一个0rand_max的整型随机数并返回,返 

                           回值对6取余保证随机数为0--5

cout<<ran_num<<" ";

}

return 0;

}

变量属性

static声明变量的作用:

局部变量,使存储期为程序的全过程

全局变量,该变量的作用域只限于本文件模块(即被声明的文件中)

预处理命令:以符号#靠头,且末尾不包含分号

对程序进行编译之前,根据预处理命令对程序做相应处理

经过预处理后编译程序才可以对程序进行编译等处理,得到可供执行的目标代码

编译预处理:.cpp-->.obj

C++提供的预处理主要功能:

宏定义

#define PI 3.1415926

Const (定义了常量类型,更加精确)

#define 标识符 字符串

带参数的宏定义:#define 宏名(参数表)字符串

例:#define Saba*b;即将Sab)替换为a*b

area=S(3+12+4), area=3+1*2+4;结果出错

因此宏定义的参数替换是原样替换(机械替换,不管运算规则),某些情况下不方便,可更改为(a*b

最好用内置函数inline

#define主要用于条件编译中

文件包含

一个源文件可以将另外一个源文件的全部内容包含进去

#include<头文件>

系统到系统目录中寻找包含的文件,系统提供的头文件宜采用,效率高

#include“文件名”

系统先到当前文件夹中查找,若找不到再到系统目录中寻找,系统文件和用户自己编写的文件都可以采用,一般用户自己编写文件时采用

条件编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值