C语言之函数

目录

main函数和库函数

什么是函数

 

函数定义

函数头(function header)

1.返回类型(return type)

2.函数名(function name)

3.形参声明(parameter type list)

函数体(function body)

 

函数调用

求三个数中的最大数

将函数的返回值作为参数传递给函数

 调用其他函数

值传递


 

程序由多个零件组合而成,而函数就是这种“零件”的一个较小单位。接下来我们来学习函数的基本知识。


main函数和库函数

截至目前为止,我们一直都在的程序格式如下:

#include<stdio.h>

int main()
{
	
	/*………………*/
	
	return 0;
}

蓝底字部分称为main函数,在C语言中是必不可少的,在程序执行时,会执行main函数的主体部分。

main函数中使用了printf、scanf、putchar等众多函数,由C语言提供的众多函数称为库函数


什么是函数

所谓函数,来源于数学术语函数(function),具有功能、职责的作用。所以每一个函数,就相当于完成任务的一个工具。

我们可以自己来创建各种函数,这也是我们必须学会的。

printf函数和scanf函数等创建好的函数,即使不知道内容,只要了解其使用方法,也可以轻松使用,就像是一个魔法盒一样。

要像精通这个魔法盒一样的函数,需要我们站在函数创建者和使用者双方的立场上,进行两种学习

函数的创建方法——函数定义

函数的使用方法——函数调用

 


函数定义

我们先来学习函数的创建方法,定义一个max2的函数

#include<stdio.h>

int max2(int a, int b)
{
	if(a > b)
		return a;
	else
		return b;
}

这个函数定义有多个部分构成:

375633d555a54dcea49c7bd006eff575.png

函数头(function header)

该部分表示函数的名称和格式。实际上称作函数的脸更合适。

1.返回类型(return type)

函数返回的值——返回值(return value)的类型。该函数的情况下,返回的两个的是两个int型数值最大的一个,其类型是int型。

2.函数名(function name)

函数的名称,从其他零件调用函数时,使用函数名。

3.形参声明(parameter type list)

小括号扩起来的部分,适用于接收辅助性提示的变量——形式参数的声明,使用多个参数时用逗号隔开。

函数体(function body)

bc3175445cd240e1bf4b95e1ffe84076.png

函数体是复合语句。仅在某个函数中使用的变量,原则上应在该函数中声明和使用。但要注意不能声明和形参同名的变量,否则会发生变量名的冲突。

 


函数调用

我们已经知道了函数的创建方法(函数定义),接下来让我们学习函数的使用方法(函数调用)。

让我们先创建一个求最大值的函数并且调用它:

#include<stdio.h>

int max2(int a, int b)
{
	if(a > b)
		return a;
	else
		return b;
}
int main()
{
	int n1, n2;
	
	puts("请输入两个整数:");
	printf("整数1:");    scanf("%d", &n1);
	printf("整数2:");    scanf("%d", &n2);
	
	printf("较大的整数是%d\n", max2 (n1, n2));

}

该程序定义了两个函数max2和main,程序首先执行的是main函数(虽然max2函数定义在main函数之前)。使用函数的过程称为函数调用。

我们来用图具体说明在函数调用,程序时怎么执行的:

ae69248c3b15430a80e8a490ca3b06d1.png

我们可以说:函数max2,给你两个值,哪个值最大?

 函数调用的形式是在函数名后面加上小括号,这个小括号称为函数调用运算符,使用函数调用运算符的表达式称为函数调用表达式。

1.函数调用运算符括起来的是实参,实参可以有多个,需要用逗号隔开。

2.进行函数调用后,程序的流程将会一下调到该函数处,main函数立刻停止,开始执行max2函数。

3.在被调用的一方,会生成用于形参的变量(在函数定义时形参并不是实际存在的),并赋予实参的值。

4.形参完成初始化后,将会执行函数体,程序在执行时遇到return语句或者是循环体最后的 } ,就会从该函数跳转到调用函数。return后面的表达式(比如说return b)在回到调用函数main函数时,可以看为给它带的一个小礼物。

返回值是通过对函数调用表达式进行判定而得到的。

比如a=5,b=6.6,由于函数返回类型时int型,所以得到的判定结果就是int 6

函数调用运算符
x(arg)                                   向函数传递实参arg并调用,如果返回值类型不是void,则生成函数x返回的值。

关于返回值类型void,我们会在下一节中学到。

函数调用时传递的只是参数的值,因此使用的实参既可以是变量也可以是常量。例如:

max (n1, 5)

 另外,实参和形参是两个不同的东西,因此不用担心它们名字相同。

接下来我们看下return语句的结构:

dd99f7174815458b80bf9bb2300da97b.png

函数返回的是表达式的值,不能有两个。

接下来我们来看看关于max2函数的其他定义的方法:

/*第一种*/
int max2(int a, int b)
{
	int max;
	if(a > b)
		max = a;
	else
		max = b;
	return max;
}

/*第二种*/
int max2(int a, int b)
{
	int max = a;
	if(b > max)
		max = b;
	return max;
		
}

/*第三种*/
int max2(int a, int b)
{
	return (a > b) ?a : b;//使用了条件运算符
}

在第一种函数和第二种函数,都使用了变量max,像这样只在某个函数中使用的变量,需要在该函数中进行声明,但是不能与形参的名字重复,否则会发生变量名的冲突。


求三个数中的最大数

我们学习完函数的定义与声明后,应该初步会编写一些简单的程序了,接下来我们来编写求三个数中的最大数的值

#include<stdio.h>

int max3(int a, int b, int c)
{
	int max = a;
	if(b > max) max = b;
	if(c > max) max = c;
	
	return max;
}

int main()
{
	int n1, n2, n3;
	
	printf("整数1:"); scanf("%d", &n1);
	printf("整数2:"); scanf("%d", &n2);
	printf("整数3:"); scanf("%d", &n3);

	printf("最大值是%d。\n", max3 (n1, n2, n3 ));
	
	return 0;
}

 

将函数的返回值作为参数传递给函数

#include<stdio.h>

/*返回x的平方*/
int sqr(int x)
{
	return x * x;
}

/*返回x和y的值*/
int diff(int a, int b)
{
	return (a > b) ?a - b:b - a;
}

int main()
{
	int x, y;
	
	puts("请输入俩个整数:");
	printf("整数1:"); scanf("%d", &x);
	printf("整数2:"); scanf("%d", &y);

	printf("两个整数的平方差是%d", diff(sqr(x), sqr(y)));
	
	return 0;
}

1.该程序中先调用函数sqr,把实参的值传递给x,进行平方后得到返回值。

2.再把返回值作为实参传递给函数diff中的形参a和b,对该表达式进行判断后得到返回值

3.最后main函数直接将返回值传递给printf函数并显示。


 调用其他函数

截止到目前为止,我们都是在main函数中调用库函数或我们自己创建的函数,现在我们来学习在自己创建的函数调用其他函数。

#include<stdio.h>

/*返回较大值*/
int max2(int a, int b)
{
	return (a > b) ? a : b;
}

/*返回四个整数中的最大值*/
int max4(int a, int b, int c, int d)
{
	return max2(max2(a, b), max2(c, d));
}

int main()
{
	int n1, n2, n3, n4;
	
	printf("整数1:"); scanf("%d", &n1);
	printf("整数2:"); scanf("%d", &n2);
	printf("整数3:"); scanf("%d", &n3);
	printf("整数4:"); scanf("%d", &n4);

	printf("最大的整数是%d", max4(n1, n2, n3, n4));
	
	return 0;
}

我们来拆解分析下:

1.首先在main函数中调用max4函数,main函数立刻停止,把实参赋值给max4中的形参。

 

2.然后在max4函数中调用两次max2函数,第一求a和b中较大数、c和d中较大数第二次调用     比较它们二者比较后得出的较大数。

 

3.最后main函数把返回值传递给printf函数并显示。

 通过这个案例,我们可以认为函数就是一个程序的零件,例如想实现显示功能时,就调用printf函数这个零件。在制作零件的时候,如果有其他方便的零件,我们也可以大量使用。


值传递

我们来创建一个计算幂的函数。

#include<stdio.h>

/*返回x的n次幂*/
int power(double x, int n)
{
	int i;
	double tmp = 1.0;
	
	for(i = 1; i <= n; i++)
	{
		tmp *= x;
	}
	return tmp;
}

int main()
{
	double a;
	int b;
	
	printf("求a的b次幂。\n");
	printf("实数1:"); scanf("%lf", &a);
	printf("整数2:"); scanf("%d", &b);
	
	printf("%.2f的%d次幂是%.2f。\n", a, b, power(a, b));
	
	return 0;
}

形参x被赋上实参a的值,形参n被赋上b的值,像这样通过值来进行参数传递的机制称为值传递

注意

函数间参数的传递称是通过值传递进行的。

形参x是实参a的副本,形参n是实参b的副本,所以在调用一方的函数power,即使改变所接受的形参的值,调用的实参也不会受影响。

到此为止,我们已经学习了函数一部分的基础知识,关于函数部分虽然有些抽象,但不要畏难,多看几遍书和视频讲解,相信大家都能乘风破浪。02d6ee155a634680886a7b79739f0cef.jpeg

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学海无涯.苦作舟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值