C语言学习——学习函数

目录

1.初识函数

2.函数定义与调用

 3.从函数返回

4.没有返回值的函数

5.函数参数

函数先后关系

6.参数传递

调用函数

传值

7.本地变量

变量的生存期和作用域

本地变量的规则

8.函数小记

没有参数时

逗号运算符

函数的嵌套


1.初识函数

从main、printf、scanf等我们遇到过的函数可以知道,函数可以执行一些我们的命令,但这些函数是C语言标准库里面的函数,我们还可以写一些自己的函数,以此来使我们的程序更简洁和个性。例如:求出1到10、20到30、35到45的三个和

最原始的写法如下,是利用三次for循环来完成

#include<stdio.h>
int main()
{
int i;
int sum;
for(i=1,sum=0;i<=10;i++)
sum+=i;
printf("%d到%d的和等于%d",1,10,sum);
for(i=20,sum=0;i<=30;i++)
sum+=i;
printf("%d到%d的和等于%d",20,30,sum);
for(i=35,sum=0;i<=45;i++)
sum+=i;
printf("%d到%d的和等于%d",35,45,sum);
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",begin,eng,sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}

如上我们定义了一个自己的函数sum来求和,成功解决了问题,并提高了我们的程序质量。

2.函数定义与调用

函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值。

  • 函数定义格式

[返回类型][函数名](参数表)//函数头

{

函数体

}

  • 函数调用格式: 

[函数名](参数值);

注意:()起到了表示函数调用的重要作用,即使没有参数也需要();如果有参数,则需要给出正确的数量和顺序,这些值会被按照顺序依次用来初始化函数中的参数。 

 3.从函数返回

类似之前写过的输出两个数中较大的数的max函数

int max(int a,int b)
{
int ret;
if(a>b) ret=a;
else ret=b;
return ret;
}

return 停止函数的执行,并送回一个值,交给调用这个函数的地方。这个值可以赋值给变量,可以再传递给函数,甚至可以丢弃。

4.没有返回值的函数

例如:

void sum(int begin,int end)
{
int i;
int sum=0;
for(i=begin;i<=end;i++)
sum+=i;
printf("%d到%d的和为%d",begin,end,sum);
}

格式为:viod 函数名(参数表)

不能使用带值的return,也可以没有return,调用的时候不能做返回值的赋值。

5.函数参数

函数先后关系

#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",begin,eng,sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}

像这样把sum()写在上面,是因为C的编译器按照自上而下的顺序分析你的代码,在看到sum(1,10)的时候,他需要知道sum()的样子,也就是sum()要几个参数,每个参数是什么样的类型,返回什么类型,这样它才能检查你对sum()的调用是否正确。

如果把void sum()放在后面,如:

#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",begin,eng,sum);
}

程序就会出现错误,但如果非要将void sum()放在后面还能正确运行的话,我们需要做一些改进,如下:

#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",begin,eng,sum);
}

我们需要把函数头在void sum()前面声明一下并加上“;”相当于我们提前告诉C语言编译器下面将有一个void sum()函数还有它的参数数量、格式、类型。

6.参数传递

调用函数

如果函数有参数,调用函数时必须传递给它数量、类型正确的值;可以传递给函数的值是表达式的结果,即包括字面量、变量、函数的返回值、计算的结果。

如果调用函数时给的值与参数的类型不匹配,虽然编译器总是会悄悄的替你把类型转换好,但是这很可能不是你所要的。

传值

如果我们想要将两个数的值进行转换,我们通常需要借助另一个变量来完成,那么我们可以试着写一个能交换两个数的值的函数。

#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 i=a;
a=b;
b=t;
}

结果为a=5 b=6 。所以这个函数不能交换两个数的值,因为每个函数都有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。C语言在调用函数时,永远只能传值给函数。

过去,对于函数表达表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”;而现在我们认为,它们是参数和值的关系。

7.本地变量

定义:函数的每次运行,都产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量。即定义在函数内部的变量就是本地变量,参数也是本地变量。

变量的生存期和作用域

生存期:什么时候这个变量开始出现了,到什么时候它消亡了

作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)

对于本地变量来说,这两个问题的答案是统一的:大括号内——块

本地变量的规则

本地变量是定义在块内的,可以是定义在函数的块内,也可以是定义在语句的块内,甚至可以随便拉一对大括号来定义变量。

程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了

块外面定义的变量在里面仍然有效,块里面定义了和外面同名的变量则掩盖了外面的,不能在一个块内定义同名的变量。

8.函数小记

  • 没有参数时

当我们定义的函数没有参数时应写为:void f(void); 它表示该函数不接收任何参数

而void f()表示的是f函数的参数表未知,并不是表示没有参数

  • 逗号运算符

 调用函数时的圆括号里面的逗号是标点符号,不是运算符。

如f(a,b)表示传了a,b两个数进去;而f((a,b))表示传了(a,b)这一表达式的值进去

  • 函数的嵌套

C语言不允许函数嵌套定义,可以在一个函数内放另一个函数的声明,但不能放另一个函数的定义 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值