当前位置: 首页 > news >正文

C语言——函数专题

1.概念

在C语言中引入函数的概念,有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码,这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数:库函数和自定义函数

2.库函数

C语言国际标准ANSIC规定了一些常用的函数的标准,被称为标准库,那不同的编译器厂商根据ANSIC提供的C语言标准就给出了一系列函数的实现。这些函数就被称为库函数

在使用库函数时,我们可以借用网站来更好地运用各种函数。

3.自定义函数

自定义函数的形式如下:

ret_type fun_name(形式参数)
{}

在上述中:

1.ret_type 是函数的返回类型

2.fun_name 是函数名

3.括号中放的是形式参数

4.{}括起来的是函数体

3.1 函数的举例

写一个加法函数,完成2个整型变量的加法操作

int Add(int x, int y)
{return x + y;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = Add(a, b);printf("%d\n", c);return 0;
}

4.形参和实参 

在函数使用的时候,我们把函数的参数分为实参和形参。

在函数定义的部分,函数名后边的参数,叫:形式参数,简称形参。 

 在调用函数时,真实传递给函数的参数,叫:实际参数,简称实参

4.1 形参和实参的关系

通过对于代码的调试和运行结果的关系,我们可以看出,形参只是实参的一份临时拷贝

5.return语句

在函数的设计中,经常会出现return语句,那么return语句的注意事项有:

1.return后边可以是数值,也可以是一个表达式。

2.return后边也可以什么都没有,直接写return。

3.如果return返回的值和函数返回类型不一样,系统会自动将返回的值隐式转换为函数的返回类型。

4.return语句执行后,函数就彻底返回,后面的代码不再执行。

5.如果函数中存在if等分支语句,则要保证在每种情况下都有return返回,否则会出现编译错误。

6.数组做函数参数

在使用函数解决问题时,难免会将数组作为函数传递给参数,在函数内部对数组进行操作。

例如:

void set_arr(int arr[10], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = -1;}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };int sz = sizeof(arr) / sizeof(arr[0]);//写一个函数将数组的内容全部置为-1set_arr(arr, sz);return 0;
}

注意:

1.数组在传参的时候,实参就写数组名就行,形参也是数组的形式。

2.实参和形参的名字是可以一样的,也可以不一样。

3.函数在设计的时候,尽可能功能单一。

4.数组在传参的时候,形参的数组和实参的数组是同一个数组。 

5.形参如果是一维数组,数组大小可以省略不写;如果是二维数组,行可以省略,但是列不能省略。

7.嵌套调用和链式访问

7.1 嵌套调用

假设我们要计算某年某月有多少天?

int is_leap_year(int y)
{if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)return 1;elsereturn 0;
}int get_days_of_month(int y, int m)
{int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };int day = days[m];if (is_leap_year(y) && m == 2){day++;}return day;
}int main()
{int year = 0;int month = 0;scanf("%d %d", &year, &month);//计算int day = get_days_of_month(year, month);printf("%d\n", day);return 0;
}

 7.2 链式访问

所谓的链式访问就是将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串联起来就是函数的链式访问。

下面有一个有趣的例子:

int main()
{printf("%d", printf("%d", printf("%d", 43)));return 0;
}

我们可以猜一下结果应该是什么?

运行一下,我们可以看到——

 

那么为什么结果是这样的呢?

printf返回字符的个数。 

8.函数的声明和定义

8.1 单个文件

//函数声明
#include<stdbool.h>
bool is_leap_year(int y);//或者可以写成——
//bool is_leap_year(int),即形参的名字可以不写//函数调用
int main()
{int year = 0;scanf("%d", &year);if (is_leap_year(year))printf("%d 是闰年\n", year);elseprintf("%d 不是闰年\n", year);return 0;
}
//函数定义bool is_leap_year(int y)
{if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){return true;}elsereturn false;
}

8.2 多个文件 

多个文件的使用在数据结构中和多代码的项目中运用较广泛。

 8.3 static和extern

static是静态的 的意思,可以用来:

1.修饰局部变量

2.修饰全局变量

3.修饰函数

extern是用来声明外部符号的。

8.3.1 作用域和生命周期

作用域:是程序设计概念,通常来说,一段程序中代码所用到的名字并不是总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

:局部变量的作用域是变量所在的局部范围

:全局变量的作用域是整个工程

生命周期:指的是变量创建到变量销毁之间的一个时间段。

8.3.2 static修饰局部变量

编译器在编译代码时,就为静态变量分配了地址,而不是进入函数创建这种变量;

static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是在内存的栈区的,但是被static修饰后就存储到了静态区。存储静态区的变量和全局变量是一样的。

8.3.3 static修饰全局变量

全局变量默认是带有外部链接属性的,static修饰全局变量时,改变了全局变量的链接属性,使得外部链接属性变为内部的链接属性。

8.3.4 static修饰函数

函数有外部链接属性的,static修饰函数时,改变了函数的链接属性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LSTM 模型原理
  • Python----爬虫
  • django之select_related 与 prefetch_related用法
  • windows C++- C++/WinRT和COM组件(下)
  • Python编写Word文档
  • css-定位
  • 【Linux】——进程概念(万字解读)
  • 【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议、ONENET云平台、旭日x3派)
  • Linux环境下运行介绍
  • 51单片机学习
  • 第八季完美童模全球总冠军·韩嘉潞 破浪扬帆写就传奇
  • INSTALLMENT MORTGAGE
  • Mac升级系统文件都丢了怎么办?Mac更新后资料找不到了怎么恢复
  • 【ARM 芯片 安全与攻击 6 -- ARM 中的 PAC 是什么?】
  • 2024年电赛H题全开源
  • __proto__ 和 prototype的关系
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Docker 笔记(2):Dockerfile
  • JavaScript的使用你知道几种?(上)
  • Java基本数据类型之Number
  • Java-详解HashMap
  • JS基础之数据类型、对象、原型、原型链、继承
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • passportjs 源码分析
  • Redash本地开发环境搭建
  • scala基础语法(二)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 不上全站https的网站你们就等着被恶心死吧
  • 给Prometheus造假数据的方法
  • 判断客户端类型,Android,iOS,PC
  • 浅谈Golang中select的用法
  • 我的面试准备过程--容器(更新中)
  • 学习Vue.js的五个小例子
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #git 撤消对文件的更改
  • #ifdef 的技巧用法
  • #大学#套接字
  • #在 README.md 中生成项目目录结构
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (13):Silverlight 2 数据与通信之WebRequest
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C语言)球球大作战
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (实战篇)如何缓存数据
  • (原創) 未来三学期想要修的课 (日記)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core 成都线下面基会拉开序幕
  • .net refrector
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET导入Excel数据
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ACM独立出版]2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)