C语言学习(六)函数
admin
2024-04-03 20:47:27
0

文章目录

  • 一、函数基础
    • 1.1 什么是函数
    • 1.2 为什么使用函数
    • 1.3 定义函数
      • 1.3.1 函数定义格式
        • 1.3.1.1 函数定义示例
          • 1.3.1.1.1 int返回类型的函数定义
          • 1.3.1.1.2 无返回类型的函数定义
          • 1.3.1.1.3 double返回类型的函数定义
      • 1.3.2 return表达式含义
        • 1.3.2.1 return表达式示例
  • 二、函数的分类
    • 2.1 有参函数和无参函数
      • 2.1.1 有参数函数示例
      • 2.1.2 函数调用和函数定义的顺序
      • 2.1.3 形参和实参
  • 三、变量作用域
    • 3.1 变量作用域
      • 3.1.1 全局变量
      • 3.1.2 局部变量
      • 3.1.3 注意

一、函数基础

1.1 什么是函数

逻辑上:

1、能够完成特定功能的独立的代码单元。

物理上:

1、能够接受数据。
2、能够对接收的数据进行处理。
3、能够将数据处理的结果返回(也可以不返回任何值)。

总结:函数是一个工具,它是为了解决大量类似问题而设计的。函数可以当作一个黑匣子。

1.2 为什么使用函数

1、避免了重复性编写代码的操作。
2、有利于程序的模块化。

1.3 定义函数

1.3.1 函数定义格式

函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法。

函数返回值类型 函数名字(函数的形参列表)
{函数的执行体;return 待返回的值;
}

注意:

  1. 函数定义时必须指定函数的类型,带返回值的函数类型应该与其返回值类型相同。函数返回值的类型也称为函数的类型,因为如果函数名前面的返回值类型和函数执行体中的表达式的类型不同的话,最终函数返回值的类型以函数名前的返回值类型为准。而没有返回值的函数类型应该定义为void类型。
  2. 函数名的命名方法与命名变量的方法一样,不能以数字开头,只能以字母和下划线开头,且遵循驼峰原则。
  3. 函数名的命名不能使用C语言的关键字进行命名。
  4. 函数名的命名应尽量简单易懂。

1.3.1.1 函数定义示例

1.3.1.1.1 int返回类型的函数定义
#include // 主函数就是一个int返回类型的函数。int表示该函数的返回值为int类型
// main为函数名
// 圆括号中的void表示该函数无参数
int main(void){return 0; // 0表示主函数返回值为0
}
# include // 定义f()函数
int f()
{return 10.8;	//因为函数的返回值类型为int,所以最终f的返回值是10而不是10.8
}// 定义主函数
int main(void)
{int x = 0;x = f(); printf("%d\n", x); // x的值为10return 0;
}
1.3.1.1.2 无返回类型的函数定义
// void表示该函数无返回数据类型。
// Info表示函数名。
// 圆括号中的void表示该函数无参数。
void Info(void){printf("This is info");return; // 表示终止函数,而不是返回类型值。return也可不写。
}
1.3.1.1.3 double返回类型的函数定义
// double表示该函数的返回类型为double类型
// Div表示函数名
// void表示该函数无参数
double Div(void){double num = 10.0;
double div = 5.0;
double ret = 0;ret = num / div;return ret;
}

1.3.2 return表达式含义

1、终止被调函数,向主调函数返回表达式的值。
2、如果return后的表达式为空,则只终止函数,不向被调用函数返回任何值。
3、break是用来终止循环和switch,return是用来终止函数的。

1.3.2.1 return表达式示例

# include void f(void)
{int i;for (i = 0; i < 5; ++i){printf("同志们辛苦了\n");break;		//终止循环return;		//终止函数}printf("同志们好\n");
}
int main(void)
{f();return 0;
}

二、函数的分类

1、有参函数和无参函数
2、有返回值和无返回值
3、库函数和用户自定义函数
4、值传递函数和地址传递函数
5、普通函数和主函数(main函数)

一个程序必须有且只能有一个主函数。主函数可以调用普通函数,普通函数不能调用主函数。普通函数可以相互调用。主函数是程序的入口,也是程序的出口。

2.1 有参函数和无参函数

有参函数就是在函数名后的括号中有参数的定义。在函数名后面括号中的参数称为形参。在函数调用时传递的具体值是实参。无参函数就是在函数名后的括号中为void或为空的函数。

2.1.1 有参数函数示例

示例1:比较两个数的最大值

# include // i,j为函数的形参
int max(int i, int j)
{if (i > j)return i;elsereturn j;}int main(void)
{int a, k, m;while (1){printf("请输入数值:\n");scanf("%d %d", &k, &m);// k,m为函数调用时传入的实参a = max(k, m);printf("%d\n", a);}return 0;
}

示例2:判断是否为素数

# include 
# include // bool表示返回值为布尔类型
// val为函数的形参,int为形参的数据类型
bool Isprime(int val)
{int i;for (i = 2; i < val; ++i){if (val % i == 0)break;}if (i == val)return true;elsereturn false;
}int main(void)
{int val = 0;scanf("%d", &val);// val为函数的实参if (Isprime(val))printf("Yes");elseprintf("No");return 0;
}

2.1.2 函数调用和函数定义的顺序

如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:

1、告诉编译器即将可能出现的若干字母代表的是一个函数。
2、告诉编译器即将可能出现的若干字母所代表的函数的形参和返回值的具体情况。
3、函数声明是一个语句,末尾必须加分号。
4、对库函数的声明是通过# include <库函数所在的文件的名字.h>来实现。

2.1.3 形参和实参

1、个数相同
2、位置一一对应
3、数据类型必须相互对应

三、变量作用域

3.1 变量作用域

3.1.1 全局变量

在所有函数外部定义的变量。
全局变量使用范围:从定义位置到整个程序结束。

示例:

# include int AllArea = 100; // 全局变量,定义在所有函数的外面// int i,int j为函数的形参
int max(int i, int j)
{if (i > j)return i;elsereturn j;}int main(void)
{int a, k, m;while (1){printf("请输入数值:\n");scanf("%d %d", &k, &m);// k,m为函数调用时传入的实参a = max(k, m);printf("%d\n", a);}return 0;
}

3.1.2 局部变量

在一个函数内部定义的变量或者函数的形参。
局部变量的使用范围:只能在本函数的内部使用

局部变量在函数调用时创建,在函数结束后销毁。

示例:

# include int AllArea = 100; // 全局变量,定义在所有函数的外面// int i,int j为函数的形参,也是该函数的局部变量
int max(int i, int j)
{if (i > j)return i;elsereturn j;}int main(void)
{int a, k, m;	// 局部变量,声明在主函数的内部,不能在函数的外面使用while (1){printf("请输入数值:\n");scanf("%d %d", &k, &m);// k,m为函数调用时传入的实参a = max(k, m);printf("%d\n", a);}return 0;
}

3.1.3 注意

在一个函数内部如果定义的局部变量的名字和全局变量的名字一样时,局部变量会屏蔽全局变量。

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...