函数、变量作用域、预处理(22)

自定义函数

系统函数重点掌握函数功能、如何使用,至于函数如何实现(函数体)则往往不需要关心。系统函数一般完成一些普遍通用的功能,遇到一些特殊的应用问题就需要自己来完成。自定义函数不仅仅包括函数四要素的设计:函数名、参数、函数类型(返回值)和函数体,而且还在需要的时候进行函数的申明和调用。

自定义函数往往集中于函数体(功能)的设计,忽略了函数输入返回的关系;因此,合理的思路应该是优先分析函数的参数(输入)的个数、类型等等,从输入到输出寻找解决问题的方法。

素数判断函数

int fun(int x)
{
    int i;
    for(i=2;i<x;i++)
    {
        if(x%i==0) return 0;
    }
    return 1;
}

return 语句比break更厉害,直接返回函数调用的结果。输入的 x 应该大于1的正整数,返回的结果用0表示假,1表示真(C++可用bool类型,返回false 或者 true)

函数的申明

类似于系统函数调用先包含头文件,自定义函数也需要先进行申明,除非被调用函数的定义写在调用函数的前面。

 函数的申明也就是引用函数定义的三要素,其中形参名可以省略;函数申明是语句,加分号;

 定义在前面,可以省略。fun函数的定义也可以写在其他文件里(CPP文件),如果很多函数写在一个文件里,调用的时候需要一个个导入则非常麻烦,不方便管理。可以把该CPP的所有函数的申明语句放到一个文件里(.h文件)那么就可以像系统函数一样,包含头文件即可。

系统函数的头文件用尖括号 < >,自定义函数的头文件用双引号 "  ",查找的路径不同。

形参与实参的关系

形式参数(形参)在定义的时候是没有具体的值,但是调用中肯定通过输入完成赋值。实际参数(实参)则就是调用的时候的具体的值。很明显,赋值需要满足 形参必须是变量,实参则可以是变量、常量等表达式。

形参与实参仅仅是赋值的关系:有传值和传地址两种方式,传地址其实也是一种赋值,不同在于把一个变量的地址传入函数,修改该地址的变量值会影响传入的实参值。传址方式需要一种特殊的数据类型(专门保存地址的变量),那就是指针。以下的函数则完成不了实参交换的功能:

void fun(int a,int b)
{
    int t;
	t=a;
	a=b;
	b=t;
}

调用 fun(x,y); x 与 a , y 与 b 的关系是赋值与被赋值的关系,赋值完毕后还是两个独立变量再无任何连续。传址的方式可以完成:把x和y的地址传进去,交换这两个地址所保存的变量的值,当然就是x和y,需要用到指针,后面再说。

其实还有另外一种方式,称为引用:给变量取“外号”

void fun(int &a,int &b)
{
    int t;
	t=a;
	a=b;
	b=t;
}
int main()
{
	int x=2,y=3;
	fun(x,y);
	cout<<x<<" "<<y<<endl;
	return 0;
}

注意:定义的时候,在形式参数加 “&” 符号,表示对实参的引用,可以理解为a 就是x,b就是y,很显然,交换a,b就是交换x,y;引用只能是变量,不能是其他表达式,这点要注意。

变量的作用域与生存期

在同一函数里定义两个同名的变量肯定会有冲突的歧义,这就涉及到变量作用域的问题。也就是说不同作用域中能否同名的变量?

局部变量与全局变量、外部变量

局部变量是定义在函数体或者复合语句块里的,简单而言可以认为有一对大括号包含的;全局变量则是定义在函数体外的,也就是没有大括号包含的(非严谨,好理解)

局部变量的作用域:从定义开始到包含的大括号结束(最内层)

全局变量:从定义开始到文件结束,拓展到其他的CPP文件,需要外部引用,那么全局变量则可以变成外部变量;

外部变量:在其他CPP文件中定义的全局变量,本文件使用extern 关键字主动申请,作用范围是主动申请到文件结束(全局外部引用)或者大括号结束(局部引用)。

变量同名

变量作用域不同,尤其是存放的空间不同(局部存在栈区,全局有专门的空间,外部则是对全局的引用),这种情况下的变量同名是可以的。解决冲突的规则就是“局部优先”

1、新建f.cpp文件,定义一个全局变量  int t =100;

2、在test.cpp种定义全局变量int a=1;

3、extern int t ;局部引用f.cpp种定义的全局变量;

4、复合语句中定义int a=5; 作用域局限于本复合语句。

注意点:局部引用的外部变量也不能跨作用域,下面是错误的

 解决方法是把extern int t; 提到大括号外面,实现全局引用。

在有全局变量定义的前提下,不能再申明同名的全局变量,跨文件也不行:

f.cpp中定义了t全局变量,在test.cpp中就不能再定义,可见全局变量所带来的隐患还是很多的,这就是为什么要尽量避免全局变量的使用。

 变量的生存期

除了作用域外, 变量还有生存期的概念:静态和动态,静态变量加static,动态是默认的,还有寄存器等等变量(忽略)。

静态局部变量是经常遇到的问题,语法:只做一次定义(包括初始化),程序结束后才回收销毁(意味着下次使用则还是原来变量):

 t是静态局部变量,定义初始化只在第一次执行,第二次调用则保留了原来的值,输出为8.

静态全局变量和普通的全局还是有点区别:普通的全局变量可以外部引用,静态全局变量则不允许外部引用,也就是作用域不能拓展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值