在接触了结构
与语句
等内容后,
我们进一步地来学习一下更加重要、也更加具有难度的内容:
函数
:
分类
定义
函数参数
返回值
数值类型转换
提到函数,我们最先想到的肯定是数学中的函数,那么C语言中的函数与它有什么关系呢?
这里所说的函数
实际并不是数学中的函数。
函数
组成,不同的函数在程序中发挥着不同的作用。
main
函数+ scanf
函数+ printf
函数+ 逻辑代码
就可以组成一个C语言程序维基百科中对函数的定义:
子程序
在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
用身边的东西形容的话,
函数
就好比身边的各种店铺,五金店,食品店,服装店…里面有各自售卖的不同商品,我们分别能在对应的商铺中满足不同的需求。函数的作用就像一个个店铺,把各种具有不同功能的代码打包(
定义函数的目的
:将一个常用的功能封装起来,方便以后调用),就像店铺之间都隔着墙一样。这样的好处是简化代码。
举个实际例子,
某些功能实现起来并不难,但实际上往往需要多次使用该功能,由于懒是第一生产力(),于是函数诞生了。
库函数
和用户定义函数
两种C语言不仅提供了极为丰富的库函数, 还允许用户建立自己定义的函数。用户可把自己的算法编写成一个个相对独立的函数,然后再需要的时候调用它
库函数
:由C语言系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf、scanf、getchar、putchar
等函数均属此类。注意:使用库函数必须包含头文件,例如我们使用
printf()
与scanf()
时要引用stdio.h
头文件,即我们通常写的#include
用户定义函数
:由用户按需编写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。有返回值函数
和无返回值函数
两种
有返回值函数
: 此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。(必须指定返回值类型和使用return关键字返回对应数据)无返回值函数
: 此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。(返回值类型为void
, 不用使用return关键字返回对应数据)无参函数
和有参函数
两种
无参函数
: 在函数定义及函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。有参函数
: 在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)自定义函数
书写格式:
返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) //函数名:函数叫什么名字
{
函数体; //函数体:函数是干啥的,里面包含了什么代码
返回值; //返回值类型: 函数执行完毕返回什么和调用者
}
示例:
int main()
{
printf("hello world\n");
retrun 0;
}
无参无返回值函数
定义:return
可以省略void 函数名() {
函数体;
}
示例:
// 1.没有返回值/没有形参
// 如果一个函数不需要返回任何数据给调用者, 那么返回值类型就是void
void printRose()
{
printf(" {@}\n");
printf(" |\n");
printf(" \\|/\n"); // 注意: \是一个特殊的符号(转义字符), 想输出\必须写两个斜线
printf(" |\n");
// 如果函数不需要返回数据给调用者, 那么函数中的return可以不写
}
无参有返回值函数
定义:返回值类型 函数名()
{
函数体;
return 值;
}
int getMax()
{
printf("请输入两个整数, 以逗号隔开, 以回车结束\n");
int number1, number2;
scanf("%i,%i", &number1, &number2);
int max = number1 > number2 ? number1 : number2;
return max;
}
有参无返回值函数
定义:类型 变量名,类型 变量2,......
void 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
{
函数体;
}
示例:
void printMax(int value1, int value2)
{
int max = value1 > value2 ? value1 : value2;
printf("max = %i\n", max);
}
有参有返回值函数
定义:返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
{
函数体;
return 0;
}
示例:
int printMax(int value1, int value2)
{
int max = value1 > value2 ? value1 : value2;
return max;
}
void test(){
}
void test() { // 报错
}
形式参数
小括号()
中定义的变量称为形式参数,简称形参int max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
}
实际参数
int main()
{
int num = 99;
// 88, num, 22+44均能得到一个确定的值, 所以都可以作为实参
max(88, num, 22+44); // 实际参数
return 0;
}
注意
:
int max(int number1, int number2)
{ // 形式参数
return number1 > number2 ? number1 : number2;
}
int main()
{
// 函数需要2个形参, 但是我们只传递了一个实参, 所以报错
max(88); // 实际参数
return 0;
}
void change(double number1, double number2)
{ // 形式参数
// 输出结果: 10.000000, 20.000000
// 自动将实参转换为double类型后保存
printf("number1 = %f, number2 = %f", number1, number2);
}
int main()
{
change(10, 20);
return 0;
}
数据类型存在自动转换的情况.
自动转换发生在不同数据类型运算时,在编译的时候自动完成。
char
类型数据转换为int
类型数据遵循ASCII
码中的对应值.
注
:
字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换
char可以转换为int,int可以转换为double,char可以转换为double。但是不可以反向。
强制类型转换是通过定义类型转换运算来实现的。其一般形式为:
(数据类型) (表达式)
其作用是把表达式的运算结果强制转换成类型说明符所表示的类型
在使用强制转换时应注意以下问题:
(int)(x/2+y)
写成(int)x/2+y
则成了把x
转换成int
型之后再除2
再与y
相加了。注
:
int
max(int number1, int number2)// 形式参数
{
return number1 > number2 ? number1 : number2;
}
return
实际返回的值类型应保持一致。如果两者不一致,则以返回值类型为准,自动进行类型转换int height()
{
return 3.14;
}
int main()
{
double temp = height();
printf("%lf", temp);// 输出结果: 3.000000
}
return
语句后面的代码就不再被执行int max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
printf("执行不到"); // 执行不到
return 250; // 执行不到
}
c语言入门这一篇就够了-学习笔记(一万字)
13 万字 C 语言从入门到精通保姆级教程2021 年版
史上最强C语言教程----函数(1)
C语言程序设计 —— 中国大学mooc
C语言初阶——手把手教零基础/新手入门(万字心得笔记)
【2023年官方C语言】9小时快速精通C语言,动画讲解C语言视频教程 —— Bilibili