C++ 语法基础课6 —— 函数

news2024/11/15 12:47:02

文章目录

  • 1. 函数基础
    • 1.1 编写函数
    • 1.2 调用函数
    • 1.3 形参和实参
    • 1.4 函数的形参列表
    • 1.5 函数返回类型
    • 1.6 局部变量、全局变量与静态变量
  • 2. 参数传递
    • 2.1 传值参数
    • 2.2 传引用参数(可以改变实参)
    • 2.3 数组形参(可以修改函数外数组)
      • 2.3.1 一维数组形参
      • 2.3.2 多维数组形参
    • 2.4 函数重载
    • 2.5 数组大小
  • 3. 返回类型和return语句
    • 3.1 无返回值函数
    • 3.2 有返回值的函数
  • 4. 函数递归(重难点)

1. 函数基础

  • 一个典型的函数定义包括以下部分:返回类型、函数名字、由0个或多个形参组成的列表以及函数体
  • void 表示没有返回值
#include<iostream>
using namespace std;

// 函数声明
int foo(int n);

// 函数定义
int foo(int n)
{
	int res = 0;
	for(int i = 0;i < n; i++)
	{
		res *= i;
	}
	return res;
}

int main();
{
	int t = foo(5);
	cout << t << endl;
	return 0;
}

1.1 编写函数

  • 我们来编写一个求阶乘的程序,程序如下所示:
int fact(int val)
{
    int ret = 1;
    while (val > 1)
        ret *= val -- ;
    return ret;
}
  • 返回类型是int,函数名字是fact,它作用于一个整型参数,返回一个整型值
  • return语句负责结束fact并返回ret的值

1.2 调用函数

int main()
{
    int j = fact(5);
    cout << "5! is " << j << endl;
    return 0;
}
  • 函数的调用完成两项工作:一是用实参初始化函数对应的形参,二是将控制权转移给被调用函数。此时,主调函数的执行被暂时中断,被调函数开始执行

1.3 形参和实参

  • 实参是形参的初始值。第一个实参初始化第一个形参,第二个实参初始化第二个形参,依次类推。形参和实参的类型和个数必须匹配
fact(“hello”);		// 错误:实参类型不正确
fact(); 			// 错误:实参数量不足
fact(42, 10, 0); 	// 错误:实参数量过多
fact(3.14); 		// 正确:该实参能转换成int类型,等价于fact(3);
  • 形参也可以设置默认值,但所有默认值必须是最后几个。当传入的实参个数少于形参个数时,最后没有被传入值的形参会使用默认值

1.4 函数的形参列表

  • 函数的形参列表可以为空,但是不能省略
void f1() {/* …. */}			// 隐式地定义空形参列表
void f2(void) {/* … */} 		// 显式地定义空形参列表
  • 形参列表中的形参通常用逗号隔开,其中每个形参都是含有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型都写出来:
int f3(int v1, v2) {/* … */} 		// 错误
int f4(int v1, int v2) {/* … */} 	// 正确

1.5 函数返回类型

  • 大多数类型都能用作函数的返回类型。一种特殊的返回类型是void,它表示函数不返回任何值。函数的返回类型不能是数组类型或函数类型,但可以是指向数组或者函数的指针

1.6 局部变量、全局变量与静态变量

  • 局部变量只可以在函数内部使用,全局变量可以在所有函数内使用。当局部变量与全局变量重名时,会优先使用局部变量
  • static静态变量相当于在该函数内部开了一个只有该函数能使用的全局变量
    在这里插入图片描述

2. 参数传递

2.1 传值参数

  • 当初始化一个非引用类型的变量时,初始值被拷贝给变量。此时,对变量的改动不会影响初始值
#include<iostream>
using namespace std;

int f(int x)
{
	x = 5;
}
int main()
{
	int x = 10;
	f(x);
	cout << x << endl;
	return 0;
}

在这里插入图片描述

2.2 传引用参数(可以改变实参)

  • 当函数的形参为引用类型时,对形参的修改会影响实参的值。使用引用的作用:避免拷贝、让函数返回额外信息
#include<iostream>
using namespace std;

int f(int &x)
{
	x = 5;
}
int main()
{
	int x = 10;
	f(x);
	cout << x << endl;
	return 0;
}

在这里插入图片描述

2.3 数组形参(可以修改函数外数组)

  • 在函数中对数组中的值的修改,会影响函数外面的数组

2.3.1 一维数组形参

// 尽管形式不同,但这三个print函数是等价的
void print(int *a) {/* … */}
void print(int a[]) {/* … */}
void print(int a[10]) {/* … */}
  • 实例
#include<iostream>
using namespace std;

void print(int a[])
{
	for(int i = 0; i < 10; i ++) cout << a[i] << endl;
}
int main()
{
	int a[10];
	for(int i = 0; i < 10; i ++) a[i] = i;
	print(a);
	return 0;
}
  • 传入数组

在这里插入图片描述

  • 传入指针
    在这里插入图片描述

2.3.2 多维数组形参

// 多维数组中,除了第一维之外,其余维度的大小必须指定
void print(int (*a)[10]) {/* … */}
void print(int a[][10]) {/* … */}
#include<iostream>
using namespace std;

void print(int a[][10])// 第1个参数可以省略,第2个不能省
{
	for(int i = 0; i < 10; i ++)
	{
		for(int j = 0; j < 10; j ++)
			cout << a[i][j] << ' ';
		cout << endl;
	}
}
int main()
{
	int a[10][10];
	for(int i = 0; i < 10; i ++)
	{
		for(int j = 0; j < 10; j ++)
			a[i][j] = j;
	}
	print(a);
	return 0;
}
  • 改变函数内数组元素,从而改变函数外数组的元素
#include<iostream>
using namespace std;

void output(int n, int m, int a[][3])// 第1个参数可以省略,第2个不能省
{
	for(int i = 0; i < n; i ++)
	{
		for(int j = 0; j < m; j ++)
		{
			cout << a[i][j] << ' ';
			a[i][j] = 1;
		}
		cout << endl;
	}
}
int main()
{
	int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	output(3,3,a);
	puts("");
	for(int i = 0; i < 3; i ++)
	{
		for(int j = 0; j < 3; j ++)
		{
			cout << a[i][j] << ' ';
		}
		cout << endl;
	}
	
	return 0;
}

在这里插入图片描述
未传入foo(5)返回的是5,10;如果是foo(5,3) 返回的是5,3
在这里插入图片描述
在这里插入图片描述

  • 默认的值必须是后面连续的几个参数,加入foo(int a = 10,int b)则会报错

2.4 函数重载

  • 函数名一样,需要参数类型不同(函数名和参数类型不能都一样)
    在这里插入图片描述

2.5 数组大小

在这里插入图片描述

  • 结果
    在这里插入图片描述
  • 64位系统,指针长度都是64位,就是8个字节,所以b的大小为8

3. 返回类型和return语句

  • return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方
  • return语句有两种形式:
return;
return expression;

3.1 无返回值函数

  • 没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return
  • 通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句。return的这种用法有点类似于我们用break语句退出循环
void swap(int &v1, int &v2)
{
    // 如果两个值相等,则不需要交换,直接退出
    if (v1 == v2)
        return;
    // 如果程序执行到了这里,说明还需要继续完成某些功能
    
    int tmp = v2;
    v2 = v1;
    v1 = tmp;
    // 此处无须显示的return语句
}

3.2 有返回值的函数

  • 只要函数的返回类型不是void,则该函数内的每条return语句必须返回一个值。return语句返回值的类型必须与函数的返回类型相同,或者能隐式地转换函数的返回类型
#include<iostream>
using namespace std;

int max(int x, int y)
{
	if(x > y) return x;
	return y;
}

int main()
{
	int x, y;
	cin >> x >> y;
	cout << max(x, y) << endl;
	return 0;
}

4. 函数递归(重难点)

  • 在一个函数内部,也可以调用函数本身
#include<iostream>
using namespace std;

int fact(int n)
{
	if(n <= 1) return 1;
	return n * fact(n - 1);
}

int main()
{
	int n;
	cin >> n;
	cout << fact(n) << endl;
	return 0;
}

在这里插入图片描述

  • 函数嵌套

在这里插入图片描述

  • 结果
    在这里插入图片描述
  • 调用过程
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

expdp导sys用户表时报错ORA-39166、ORA-31655

问题描述&#xff1a;expdp导sys用户表时报错ORA-39166、ORA-31655&#xff0c;如下所示&#xff1a; [oracleoel~]$ expdp \/ as sysdba\ directoryDATA_PUMP_DIR dumpfiletest.dmplogfileexpdp.log tablestest Export:Release 11.2.0.4.0 - Production on Tue Nov 29 14:08:…

麒麟 docker 自启动失败

docker 问题描述&#xff1a; 自启动时出现超时问题 start operation timed out. Terminating 排查流程&#xff1a; journalctl -u docker.service .... modulegrpc Jan 04 11:17:13 control03-55 dockerd[4466]: time"2023-01-04T11:17:13.30274997408:00" leve…

隔离认证、安全标准。

目的&#xff1a; 隔离认证、安全标准。 工业安全标准与隔离组件规格关系 功能隔离、基本隔离和增强型隔离等级 安全标准定义 系统级和组件级认证 测试器件获得高压安全性 器件行业标准 高电压系统隔离&#xff0c;认证、安全标准 了解组件级与系统级标准、隔离等级…

阿里云前端专家冯军:前端用户体验该如何优化

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云前端专家冯军&#xff0c;向参会企业代表分享了前端用户体验该如何优化&#xff1f;本文根据演讲内容整理而成。 大家好&#xff0c;我叫冯军&#…

HTML a标签打开新标签页避免出现安全漏洞,请使用“noopener”

新标签页中打开一个网址如何出现安全漏洞 让我们在网站上的新标签页中打开一个网址&#xff0c;HTML如下 <a href"https://malicious-domain.netlify.com" target"_blank">访问恶意网站&#xff01; </a> 这里我们有一个指向恶意网站的 href…

当malloc为string等容器开内存时候产生的问题,malloc和new最本质的区别

报内存错误的代码: 顺利执行的代码: 可以看到在malloc为a开好空间&#xff0c;然后对自定义类型对象a中的string a成员进行赋值的时候&#xff0c;发生了内存错误&#xff0c;但是经过测试&#xff0c;使用new为string a开空间就不会发生错误; new和malloc最本质的区别 最主要…

uniCloud云开发----6、uniapp配置tabbar底部导航栏和去掉uni-app顶部标题

uniapp配置tabbar底部导航栏、去掉uni-app顶部标题前言效果图1、创建页面并声明注册2、配置pages.json--tabBar3、通过pages.json来去掉uni-app顶部标题全部页面都去掉单个页面去掉前言 tabbar文档 在 pages.json 中提供 tabBar 配置&#xff0c;不仅仅是为了方便快速开发导航…

Elasticsearch入门,持续更新中

目录elasticsearch简介elasticsearch下载问题分析解决启动可视化界面Kibana下载配置启动进入kibana的控制台elasticsearch简介 懂得都懂 elasticsearch下载 官网下载地址 链接: https://www.elastic.co/cn/downloads/elasticsearch 本人准备安装在win10上&#xff0c;本地…

IB学习阶段所需的教材有哪些?

IB课程即国际文凭组织IBO&#xff08;International Baccalaureate Organization&#xff09;&#xff0c;是为全球学生开设从幼儿园到大学预科的课程&#xff0c;为3-19岁的学生提供智力&#xff0c;情感&#xff0c;个人发展&#xff0c;社会技能等方面的教育&#xff0c;使其…

可以同时解析多个binlog吗

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 叶金荣文章来源&#xff1a;GreatSQL社区原创 1.可以同时解析多个binlog吗 2.innodb_buffer_pool_instances设…

【C语言进阶】指针的进阶(1)

作者:匿名者Unit 目录一.数组指针1.定义2.使用二.数组、指针传参1.一维数组传参2.二维数组传参3.一级指针传参4.二级指针传参三.函数指针一.数组指针 1.定义 数组指针&#xff0c;顾名思义是指向数组的指针&#xff0c;那数组指针是如何定义的呢 int (*p)[10]; //解释&#x…

JavaSE从基础到入门:异常的学习

1. 异常的概念与体系结构 1.异常的概念 异常&#xff08;Exception&#xff09;指不期而至的各种状况&#xff0c;异常发生的原因有很多&#xff0c;通常包含以下几大类&#xff1a; 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断&#xff0c;或者JVM内存溢出…

HDMI1.4/2.0 Subsystem官方例程的建立

HDMI1.4/2.0 Subsystem官方例程的建立1、 项目背景明德扬(MDY)为某研究所研制的视频接口转换模块&#xff0c;该模块将HDMI视频转成LVDS7:1视频。视频输入接口采用的是HDMI 4K输入&#xff0c;基于Xilinx K7325t的高速收发器,特点是无需外围HDMI接收芯片&#xff0c;大大简化了…

SpringBoot+VUE前后端分离项目学习笔记 - 【13 SpringBoot和Vue实现导入和导出】

hutool工具 引入Hutool工具使用ExcelWriter&#xff0c;可以将数据写出到EXCEL https://www.hutool.cn/docs/#/poi/Excel%E5%B7%A5%E5%85%B7-ExcelUtil 引入pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactI…

项目中不容忽视的图表报表

在项目工作中&#xff0c;报表可是少不了的好帮手&#xff0c;可以帮助我们向合作者以及领导直观地展示项目情况进展。项目报表的作用可以从多维度监控项目的运行&#xff0c;保障项目的顺利进行。让数据可视化&#xff0c;辅助管理者进行合理决策。及时与合作者共享项目信息&a…

使用ros从realsence相机中获取图像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、使用ros从realsence相机中获取录制的视频并播放1.开启ros内核2.打开realsense相机3.查看当前话题4.在相机界面显示RGB图像和depth图像4.1 添加Image4.2 填入…

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候&#xff0c;一定使用过javac和java这两个命令。大家在安装JDK的时候&#xff0c;验证是否安装成功&#xff0c;都会在命令行里输入java和javac命令来验证&#xff0c;这就是我们第一次使用java和…

PDF怎么编辑注释? 5 个免费好用的 PDF 注释器

成群结队的人和组织想要注释他们的 PDF 文档的原因有很多。无论哪种情况&#xff0c;目标是做到近乎完美并不是完美。但是&#xff0c;如果您没有合适的 PDF 注释器&#xff0c;这又是不可能的。虽然这些 PDF 注释器工具中的许多都很昂贵&#xff0c;但您仍然可以使用免费的 PD…

tkintertools 模块实战一:任务清单小工具

之前我自己写了一个 tkinter 模块的辅助模块 —— tkintertools&#xff0c;这次试着用这个模块开发了一款可以记录任务的小工具&#xff0c;应该会比较实用。tkinter 模块的最强辅助模块 —— tkintertools&#xff08;万字详解&#xff09;_小康2022的博客-CSDN博客tkinter 模…