hello,大家好,我是霜淮子,阅读我的文章学习c语言,作者水平有限,如果发现错误的地方,欢迎大家在评论区留言,万分感谢!
欢迎订阅专栏《c语言程序设计》
目录
前言
在软件开发与程序设计过程中,采用模块化的手段,将一个复杂的问题分解为若干个易于处理的子问题,将整个程序划分成若干个子程序模块,可以降低程序开发的难度,提高程序开发的效率
6.1、函数的定义和使用
6.1.1、函数的定义和调用
什么是函数?
函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值。
函数定义
调用函数
函数名(参数值)
- ()起到了表示函数调用的重要作用。
- 即使没有参数也需要()。
- 如果有参数,则需要给出正确的数量和顺序。
- 这些值会被按照顺序一次用来初始化函数中的参数。
6.1.2、从函数中返回
int max{int a,int b}{
int ret;
if(a>b){
ret=a;
}else{
ret=b;
}
return ret;
}
- return停止函数的执行,并送回一个值
- retyrn;
- return表达式;
- 一个函数里可以出现多个return 语句。
从函数中返回值,我们用来:
- 赋值给变量
- 再传递给函数
- 甚至可以丢弃
没有返回值的函数
- void函数名(参数表)
- 不能使用带值得return
- 可以没有return
- 调用得时候不能做返回值得赋值
6.2、函数的参量和变数
6.2.1、函数原型
用老告诉编译器这个函数长什么样
#include<bits/stdc++.h>
using namespace std;
void sum(int begin,int end)//函数的原型声明
int main(){
sum(1,10);
sum(20,30);
sum(30,40);
return 0;
}
void sum(int begin,int end){
int i;
int sum=0;
for(i=begin;i<=end;i++){
sum+=i;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}
代码分析:
大家看,我们把sum函数移到后面之后,在开始的地方进行声明,声明之后的代码依然能成功实现。
声明不是函数,只是告诉编译器说:你看sum只是一个函数,它长成这个样子,有了声明之后,函数遇到sum的时候,他就知道该如何去执行。
函数原型
函数头,以;号结尾,就构成了函数的原型
6.2.2、参数传递
调用函数的时候,是用表达式的值来初始化函数的参数
调用函数
- 如果函数有参数,调用函数时必须传递给他数量、类型正确的值
- 可以传递给函数的值是表达式的结果,这包括:
- 字面量
- 变量
- 函数的返回值
- 计算的结果
类型不匹配?
- 调用函数时给的值与参数的类型不匹配是c语言传统上最大的漏洞。
- 编译器总是悄悄的替你把类型转化好,但是这很可能不是我们所期望的
传值
- 每个函数都有字节的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。
- 过去,对于函数参数表中的参数,叫做”形式参数“,调用函数值时给的值,叫做”实际参数“。
- 我们认为,它们时参数和值的关系。
6.2.3、本地变量
本地变量
- 函数的每次运行,就产生了一个肚子的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量。
- 定义在函数内部的变量就是本地变量。
- 参数也是本地变量。
变量的生存期和作用域
- 生存期:什么时候这个变量开始出现了,到什么时候它消亡了。
- 作用域:在(代码内)什么范围内可以访问这个变量(这个变量可以发挥作用)。
- 对于本地变量,这两个问题的答案是统一的:大括号内——块。
本地变量的规则
- 本地变量是定义在块内的
- 它可以定义在函数的块内
- 也可以定义咱语句的块内
- 甚至可以随便拉一对大括号来定义变量
- 程序进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
- 块外面定义的变量在里面任然有效
- 块里面定义了和外面同名的变量则掩盖外面的
- 不能在一个快内定义同名的变量
- 本地变量不会被默认初始化
- 参数在进入函数的时候就被初始化了
6.2.4、细节问题
1、函数原型里面一定要写参数,如果不确定的时候就把void放进去
void XXXX(void)
2、调用函数是的圆括号里的逗号是标点符号,不是运算符
f(a,b)和f((a,b))
后者表示要先做括号里面的逗号运算符
3、函数里的函数?
c 语言不允许函数嵌套定义。
4、关于main
- int main()_也是一个函数.(所以return是有意义的)
- int main(void)
-END-