零基础学习c语言---函数

(一)函数的概念

在我们平时学习数学时,会经常用到函数,一次函数,二次函数,反函数……而在c语言中也引入了函数的概念。

(二)库函数

在c语言中的函数一般分为库函数和自定义函数。库函数在我们之前的学习中就已经学习了一部分。比如printf,scanf都是常见的库函数,而库函数在c语言中是现成的,只要学会了就可以直接用,比如printf输出数据,scanf输入数据,而它们的使用必须在相应的头文件里进行,输入输出必须报含头文件#include <stdio.h>,sqrt()函数,也就是计算平方根,它则必须报含头文件#include<math.h>

(三)自定义函数

除了库函数外,c语言中还有自定义函数,它的形式如下

ret_type fun_name()
{


}

//ret_type是函数返回类型
//fun_name是函数名
//()里的放形式参数
//{}里放的是函数体

它不像库函数一样,我们学会了就可以直接使用,它是需要我们给它规定它要完成的任务。

注意⚠️:我们在使用函数时,要将函数的参数部分交代清楚,1:参数个数。2:每个参数的类型是什么。3:形参的名字。 比如我们想要完成一个加法运算,那么我们就可以写一个加法函数Add(),如下代码

#include <stdio.h>

int Add(int x,int y)//x,y是形式参数
{
  int z=0;
  z=x+y;
  return z;
}

int main()

{
  int a=0;
  int b=0;
  scanf("%d %d",&a,&b);
  int r=Add(a,b);  //a,b是实际参数
  printf("%d\n",r);
  return 0;
}

在上述代码中,加法函数括号里的是形式参数,而在主函数里的加法函数括号中的是实际参数。实际参数和形式参数虽然有联系,但是它们是各自独立的,在上述代码中,当我们调用了加法函数Add()时,里面的形式参数才会向内存申请空间,如果没有调用加法函数,那么Add函数的参数x,y就不会向内存申请空间,就不是真实存在

(四)return语句

在函数的设计中,会经常出现return语句。这里是使用return语句的几个注意事项⚠️

1:return后面可以是数值,像上方Add函数,return后面也可以直接是表达式,比如下方Add函数

#include <stdio.h>

int Add(int x,int y)//x,y是形式参数
{
  return x+y;
}

int main()

{
  int a=0;
  int b=0;
  scanf("%d %d",&a,&b);
  int r=Add(a,b);  //a,b是实际参数
  printf("%d\n",r);
  return 0;
}

2:return后面也可以什么都没有,适合函数返回值类型是void的情况,比如下方代码

#include <stdio.h>

void print_num(int x,int y)//无需返回值,类型是void,直接打印x,y
{
  x=2;
  y=5;
  printf("%d %d",x,y);
}

int main()

{
  int a=0;
  int b=0;
  print_num(a,b);
  return 0;
{

3:return语句执行后,函数就会彻底返回,后面的代码不执行,比如下方代码

#include <stdio.h>

void test_return()
{
  printf("函数开始执行\n");
  return;
  printf("return后的代码不会执行\n");//这一行代码不会执行
}

int main()

{
  test_return();
  return 0;
}


(五)数组作函数参数

在使用函数时,我们除了用普通的数据作为参数外,在日后的学习种肯定还会使用到数组作为函数参数。在使用数组作为函数参数时,我们需要将数组,以及数组的个数作为参数传递给函数,比如下方函数

#include <stdio.h>
void print_arr(int arr[],int sz)
{
  int i=0;
  for(i=0;i<sz;i++)
 {
  printf("%d\n",arr[i]);//打印出数组里的每个元素
 }
}

int main()

{
 int arr[]={0,1,2,3,4};
 int sz=siof(arr)/sizeof(arr[0]));//计算数组元素的个数
 print_arr(arr,sz);//实际参数传入数组arr和数组元素个数
 return 0;
}

(六)函数之间的相互调用

我们不仅能在主函数里调用我们设置的自定义函数,我也可以在我们设置的函数里再次调用我们设置的新函数,比如我们想写一个代码,要求出某年某月有多少天,首先我们可以设置一个函数,在里面存入每个月有多少天,但是因为有闰年的存在,我们可以利用前面的知识在再设置一个判断是否为闰年的函数,再在第一个函数里调用判断是否为闰年的函数,如果是,那么就要在2月份的天数上多加一天。具体代码实现如下

#include <stdio.h>

int is_leap_year(int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		return 1;
	}
	else
		return 0;

}
month_of_days(int year,int month)
{
	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int day = days[month];
	if (is_leap_year(year) && month == 2)//调用了判断是否为闰年的函数
		day += 1;
	return day;
}

int main()

{
	int year = 0;
	int month = 0;
	scanf("%d %d", &year, &month);
	int d=month_of_days(year,month);
	printf("%d", d);

	return 0;
}

(七)printf函数的返回值

这里我们补充一个printf返回值,printf函数返回的是打印再屏幕上字符的个数,如下代码

printf("%d",printf("%d",printf("%d",33));

//33是两个字符,所以返回2
//2是一个字符,所以返回1
//最终结果是3321

最终在屏幕上打印的是什么呢 没错,是3321

(八)函数的声明和定义

在我们上述代码的使用中,函数都是直接放在主函数前面的,但如果我们将函数放在主函数后面的话,如下代码

#include <stdio.h>



int main()

{
  int a=0;
  int b=0;
  scanf("%d %d",&a,&b);
  int r=Add(a,b);  //在前面没有发现Add函数
  printf("%d\n",r);
  return 0;
}

int Add(int x,int y)
{
  int z=0;
  z=x+y;
  return z;
}

会出现错误,因为在调用函数时,程序从前往后运行,当我们要使用这个函数时,程序发现前面并没有出现这个函数,所以会出现错误,想要纠正这个错误也很简单,不必将整个函数放在前面,只需要在主函数前声明一下要用的这个函数就可以,可以修正成如下形式

#include <stdio.h>

int Add(int x,int y);

int main()

{
  int a=0;
  int b=0;
  scanf("%d %d",&a,&b);
  int r=Add(a,b);  //在前面没有发现Add函数
  printf("%d\n",r);
  return 0;
}

int Add(int x,int y)
{
  int z=0;
  z=x+y;
  return z;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值