一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
昨天我们学习了函数的定义调用和返回值,除了这些函数还有那些要注意的呢?
函数
函数原型
我们知道在C语言的编译器是自上往下分析你的代码的。
我们来看一段代码:
#include <stdio.h>
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);
}
int main( )
{
sum(1,10);
sum(20,30);
sum( 35,45);
return 0;
}
#include <stdio.h>
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);
}
int main( )
{
sum(1,10);
sum(20,30);
sum( 35,45);
return 0;
}
如果我们将sum函数放到main函数下面也不提前声明这个函数。会出现什么样的错呢?
#include <stdio.h>
int main( )
{
sum(1,10);
sum(20,30);
sum( 35,45);
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);
}
他会报错那么我们该如何解决呢这格式后就要用到函数原型了。
#include <stdio.h>
void sum(int begin, int end);//函数原型声明
int main( )
{
sum(1,10);
sum(20,30);
sum( 35,45);
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);
}
这段代码中第二行叫做函数原型的声明,而第十二到十八行是函数的定义。
函数原型
函数头,以分号“;”"结尾,就构成了函数的原型
函数原型的目的是告诉编译器这个函数长什么样
- 名称
- 参数(数量及类型)
- 返回类型
参数传递
如果函数有参数,调用函数时必须传递给它数量、类型正确的值
可以传递给函数的值是表达式的结果,这包括:
- 字面量
- 变量
- 函数的返回值
- 计算的结果
传值
我们之前编写过一个交换ab值的程序那么我们可不可以使用函数来实现这个功能呢?
#include <stdio.h>
void swap(int a, int b);
int main( )
{
int a = 5;
int b = 6;
swap(a,b);
printf( "a=%d b=%d\n",a,b);
return 0;
}
void swap(int a, int b){
int t = a;
a = b;
b = t;
}
结果:
我们发现a和b的值并没有交换,这是因为C语言在调用函数是,永远只能传值给函数。
我们可以理解为每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”
本地变量(局部变量)
函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
定义在函数内部的变量就是本地变量
形式参数也是本地变量
变量的生存期(生命周期)和作用域
生存期:什么时候这个变量开始出现了,到什么时候它消亡了
作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
对于本地变量,这两个问题的答案是统一的:大括号内——块
本地变量的规则
本地变量是定义在块内的
- 它可以是定义在函数的块内
- 也可以定义在语句的块内
- 甚至可以随便拉一对大括号来定义变量
程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
块外面定义的变量在里面仍然可以调用
块里面定义了和块外面同名的变量则会覆盖外面的
不能再一个块内定义同名的变量
本地变量不会被默认初始化
参数在进入函数是会被初始化