【研0自学100天 —— Day 7 函数 】

C语言入门(7/100)

在接触了结构语句等内容后,
我们进一步地来学习一下更加重要、也更加具有难度的内容:

  • 函数
    • 函数是什么
    • 函数分类
    • 定义函数
    • 函数参数
    • 函数返回值
  • 补充: 数值类型转换
    • 自动类型转换
    • 强制类型转换

一、函数

1.1 函数是什么?

提到函数,我们最先想到的肯定是数学中的函数,那么C语言中的函数与它有什么关系呢?

这里所说的函数实际并不是数学中的函数。

  • C程序由函数组成,不同的函数在程序中发挥着不同的作用。
    • 例如: 我们前面学习的课程当中,通过 main 函数+ scanf 函数+ printf 函数+ 逻辑代码 就可以组成一个C语言程序
  • 可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言

维基百科中对函数的定义:子程序
在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

用身边的东西形容的话,

  • 函数就好比身边的各种店铺,五金店,食品店,服装店…里面有各自售卖的不同商品,我们分别能在对应的商铺中满足不同的需求。

函数的作用就像一个个店铺,把各种具有不同功能的代码打包定义函数的目的:将一个常用的功能封装起来,方便以后调用),就像店铺之间都隔着墙一样。这样的好处是简化代码。

举个实际例子,
【研0自学100天 —— Day 7 函数 】_第1张图片
某些功能实现起来并不难,但实际上往往需要多次使用该功能,由于懒是第一生产力(),于是函数诞生了。
【研0自学100天 —— Day 7 函数 】_第2张图片

  • 函数名括号内的东西就相当于店铺门,你往门里丢东西,它就会根据它对应的功能返回给你相应的东西

1.2 函数分类

1.2.1 从函数定义区分
  • 从函数定义的角度看,函数可分为库函数用户定义函数两种

C语言不仅提供了极为丰富的库函数, 还允许用户建立自己定义的函数。用户可把自己的算法编写成一个个相对独立的函数,然后再需要的时候调用它

  • 库函数由C语言系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf、scanf、getchar、putchar等函数均属此类。

注意:使用库函数必须包含头文件,例如我们使用printf()scanf()时要引用stdio.h头文件,即我们通常写的#include

  • 用户定义函数由用户按需编写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。
1.2.2 从函数执行结果区分
  • 从函数执行结果的角度来看, 函数可分为有返回值函数无返回值函数两种
    • 有返回值函数: 此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。(必须指定返回值类型使用return关键字返回对应数据)
    • 无返回值函数: 此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。(返回值类型为void , 不用使用return关键字返回对应数据)
1.2.3 从主、被调函数间数据传送区分
  • 从主调函数和被调函数之间数据传送的角度看,又可分为无参函数有参函数两种
    • 无参函数: 在函数定义及函数说明及函数调用中均不带参数主调函数和被调函数之间不进行参数传送
    • 有参函数: 在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)

1.3 定义函数

1.3.1 函数定义目的
  • 将一个常用的功能封装起来,方便以后调用
1.3.2 函数定义书写格式

自定义函数书写格式:

返回值类型 函数名(参数类型 形式参数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;
}
1.3.3 函数定义注意事项
  • 函数名称不能相同
void test(){
}
void test() { // 报错
}

1.4 函数参数和返回值

1.4.1 函数参数
  • 形式参数
    • 定义函数时,函数名后面小括号()中定义的变量称为形式参数,简称形参
    • 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
    • 因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量
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;
}

注意

  1. 调用函数时传递的实参个数必须和函数的形参个数必须保持一致
int max(int number1, int number2) 
{ //  形式参数
    return number1 > number2 ? number1 : number2;
}
int main() 
{
    // 函数需要2个形参, 但是我们只传递了一个实参, 所以报错
    max(88); // 实际参数
    return 0;
}
  1. 形参实参类型不一致, 会自动转换为形参类型
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;
}

补充:数值类型转换

补充1 :自动类型转换

数据类型存在自动转换的情况.
自动转换发生在不同数据类型运算时,在编译的时候自动完成
【研0自学100天 —— Day 7 函数 】_第3张图片
char 类型数据转换为int 类型数据遵循ASCII 码中的对应值.

字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换

char可以转换为int,int可以转换为double,char可以转换为double。但是不可以反向。

补充2 :强制类型转换

强制类型转换是通过定义类型转换运算来实现的。其一般形式为:

(数据类型) (表达式)

其作用是把表达式的运算结果强制转换成类型说明符所表示的类型

在使用强制转换时应注意以下问题:

  1. 数据类型和表达式都必须加括号, 如把(int)(x/2+y) 写成(int)x/2+y 则成了把x 转换成int 型之后再除2 再与y 相加了。
  2. 转换后不会改变原数据的类型及变量值,只在本次运算中临时性转换
  3. 强制转换后的运算结果不遵循四舍五入原则
1.4.2 函数返回值

  1. 如果没有写返回值类型,默认是int
max(int number1, int number2)//  形式参数
{
    return number1 > number2 ? number1 : number2;
}
  1. 函数返回值的类型和return 实际返回的值类型应保持一致。如果两者不一致,则以返回值类型为准,自动进行类型转换
int height() 
{
    return 3.14; 
}
int main() 
{
  double temp = height();
  printf("%lf", temp);// 输出结果: 3.000000
}
  1. 一个函数内部可以多次使用return语句,但是return语句后面的代码就不再被执行
int max(int number1, int number2) //  形式参数
{
    return number1 > number2 ? number1 : number2;
    printf("执行不到"); // 执行不到
    return 250; // 执行不到
}

学习参考对象

  1. c语言入门这一篇就够了-学习笔记(一万字)

  2. 13 万字 C 语言从入门到精通保姆级教程2021 年版

  3. 史上最强C语言教程----函数(1)

  4. C语言程序设计 —— 中国大学mooc

  5. C语言初阶——手把手教零基础/新手入门(万字心得笔记)

  6. 【2023年官方C语言】9小时快速精通C语言,动画讲解C语言视频教程 —— Bilibili

你可能感兴趣的:(研0学习,c语言,学习,笔记,经验分享)