C++ Primer 6.3 返回类型和return语句 知识点+练习题

总思维导图

C++ Primer 6.3 返回类型和return语句

  • 无返回值函数
  • 有返回值的函数
    • 两个错误
    • 值是如何被返回的
    • 返回类类型的函数和调用运算符
    • 引用返回左值
    • 列表初始化返回值
    • 主函数main的返回值
    • 返回数组指针
  • 递归
  • 练习题
  • 疑问
  • 待更新

无返回值函数

用在返回值类型为void的函数中,可以不写return,因为此类函数会在最后一句隐式执行return;
可以自己写return;在函数里类似于break,直接退出

void swap(int &v1,int &v2)
{
		if(v1==v2)
		return;//直接退出函数
		int tmp=v1;
		v1=v2;
		v2=tmp;
}

除return;还可以return func();此时func为返回值为void的函数

void func2()
{
		.....
		return swap();//!!!有疑问,不是无法返回函数吗,后续章节函数指针P223,难道是特例
}

有返回值的函数

两个错误

bool str_subrange(const string &str1,const string &str2)
{
			auto size=(str1.size()<str2.size())? str1.size():str2.size();
			for(decltype(size) i=0;i!=size;++i)
					if(str1[i]!=str2[i])
						return;//错误1,无返回值
			//错误2,for循环结束后应加上一个返回值,程序可能执行到这里再返回
}

值是如何被返回的

先拷贝再传值
不要返回局部对象的引用或指针:函数完成后,它所占用的存储空间也被释放,若返回的是局部变量则会出现问题

返回类类型的函数和调用运算符

auto sz=shorterString(s1,s2).size();//用返回的string类类型用.调用size()成员函数

引用返回左值

可把函数返回值作为可赋值的对象(左值)
返回引用可得到左值

char & get_val(string &str,string::size_type ix)
{
		return str[ix];
}
int main()
{
	...
	get_val(s,0)='A';//s是string类型
}

列表初始化返回值

c++11新标准函数可以返回花括号包围的值列表,同P39知识对应,有时间整理
leetcode 二分查找第一个和最后一个出现的值用过这种返回方式

vector<string> process()
{
		if(str1.empty())
			return{};
		else if(str1==str2)
		  return{"functionx","okay"};
		else 
			return{"functionx".str1,str2};
}

若返回的是内置类型,则{}只包含一个值,且不可超过内置类型的空间,当作赋初始值来看就好

int a={3.14};
不会转换,会报错,有丢失风险就会报错

主函数main的返回值

允许main没有return直接结束,会隐式插入return 0;语句
main的返回值可看为状态指示器,0代表成功,非0代表失败(具体值依据机器)
可以定义预处理变量分别表示成功或失败(P69有头文件预处理,解决重复包含问题)
EXIT_FAILURE失败 EXIT_SUCCESS成功,需要有cstdlib头文件

返回数组指针

数组不能被拷贝,不能返回数组,但可以返回数组指针或引用
可用方法

  1. 使用类型别名
typedef int arr[10]; arr是大小为10的整型数组的别名
using arr=int [10];
arr* func(int i);返回值是数组指针
  1. 直接声明返回
int (*func(int i))[10];返回值是数组指针 
int *func(int i);返回的是数组中具体某个元素

看下面更好理解
int arr[10];
int *p1[10];指针数组
int (*p2)[10];数组指针

数组的维度必须在函数名字之后,函数的形参列表也在后面且形参列表应先于数组维度
3. 使用尾置返回类型
c++11新标准,形参后面加->真正的类型,本应是返回值的地方放一个autoauto func(int i)->int(*) [10]
4. 使用decltypedecltype(odd) * arrptr(int i)odd为数组,因为decltype不会将数组转为指针,所以要加上*

递归

递归:函数调用自身,一定要有一个退出递归的条件(递归出口)

递归实现阶乘
int f(int val)
{
	if(val>1)
		return f(val-1)*val;
   return1;
}

练习题

6.34 若输入-5会出错
6.35 若改为val–,又有递减又有取值,c++未规定求值顺序,结果可能出错

疑问

  1. return swap();//!!!有疑问,不是无法返回函数吗,后续章节函数指针P223,难道是特例

待更新

  1. P39初始化列表
  2. P69头文件预处理,解决重复包含问题
  3. int arr[10]; arr &arr

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

深入浅出的说地弹(即地噪声)

1. 什么是地弹&#xff0c;地弹的概念&#xff0c;为何叫地弹 地弹、振铃、串扰、信号反射这几个在信号完整性分析总是分析的重点对象。初学者一看&#xff1a;好高深&#xff01;其实&#xff0c;感觉高深是因为你满天听到“地弹”二字&#xff0c;却到处找不到“地弹…

使用pandas按照商品和下单人统计下单数据

目录 一&#xff1a;需求描述 二&#xff1a;代码实现 三&#xff1a;注意事项 一&#xff1a;需求描述 最近运营那边给到一个excel表格&#xff0c;是一个小程序用户的下单数据&#xff0c;要以商品为维度&#xff0c;统计用户下单情况&#xff0c;主要是下单的商品总金额&…

DNS解析和主从复制

一、DNS名称解析协议 二、DNS正向解析 三、DNS主从复制 主服务器 从服务器

CAN总线通信详解 (超详细配34张高清图)

CAN总线通信详解 (超详细配34张高清图) 1. CAN总线历史 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#…

案例119:基于微信小程序的宿舍管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【Python机器学习】分类器的不确定估计——决策函数

scikit-learn接口的分类器能够给出预测的不确定度估计&#xff0c;一般来说&#xff0c;分类器会预测一个测试点属于哪个类别&#xff0c;还包括它对这个预测的置信程度。 scikit-learn中有两个函数可以用于获取分类器的不确定度估计&#xff1a;decidion_function和predict_pr…

kubebuilder+code-generator开发k8s的controller

本文记录用kubebuilder和code-generator开发k8s的crd控制器。 概览 和k8s.io/code-generator类似&#xff0c;是一个码生成工具&#xff0c;用于为你的CRD生成kubernetes-style API实现。区别在于&#xff1a; Kubebuilder不会生成informers、listers、clientsets&#xff0c…

【工具栏】jclasslib 插件的安装和使用

1. 安装 2.使用 安装之后 在 view 的 ToolWindows 里也有一个这样的窗口 jclasslib 的主要作用是查看字节码的相关信息 package com.test;public class Test {public static void main(String[] args) {Integer a 1;int b a 2;} }例如我写了一段这样的代码&#xff0c;然后去…

语义分割发展现状

语义分割是对图像中的每一个像素进行分类&#xff0c;目前广泛应用于医学图像与无人驾驶等。从这几年的论文来看&#xff0c;这一领域主要分为有监督语义分割、无监督语义分割、视频语义分割等。 语意分割究竟有什么用呢&#xff1f;似乎看起来没有目标检测/跟踪等应用范围广。…

P1379 八数码难题

题目描述 在 33 的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格&#xff0c;空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a;给出一种初始布局&#xff08;初始状态&#xff09;和目标布局&…

Linux centos stream9 parted

在Linux中&#xff0c;常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉&#xff0c;是过去我们使用windows时常见的。所支持的最大卷2T&#xff0c;且对分区有限制&#x…

SRM供应商招标采购管理系统(源码)

软件相关资料获取&#xff1a;点我获取 一、SRM供应商在线采购 SRM供应商在线采购是指企业通过互联网平台&#xff0c;实现对供应商的在线招募、选择、关系管理等一系列活动。这种采购方式具有高效、透明、便于管理的特点&#xff0c;能够帮助企业降低采购成本&#xff0c;提…

Vue中v-if与v-show区别详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Nightingale 夜莺监控系统 - 告警篇(3)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/usage/alert/alert-rule/ 目录 前言一、配置1.1 创建钉钉机器人1.2 n9e 创建通知用户1.3 n9e 创建团队&#xff08;组&#xff09;1.4 将通知用户添加团队1.…

C++核心编程——文件操作

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

Realm Management Extension领域管理扩展(下)

四、颗粒保护检查 本节描述了RME引入的颗粒保护检查。颗粒保护检查使得能够在不同的物理地址空间之间动态分配内存区域。 本节将向您介绍以下功能: 颗粒保护表的结构用于颗粒保护检查的故障报告区域在物理地址空间之间的过渡正如在物理地址一节中所述,RME提供了四个物理地址…

gitee完整使用教程,创建项目并上传

目录 一 什么是gitee 二 安装Git 三 登录gitee&#xff0c;生成密钥 四 配置SSH密钥 五 创建项目 六 克隆仓库到本地 七 关联本地工程到远程仓库 八 添加文件 九 异常处理 十 删除仓储 十一 git常用命令 一 什么是gitee gitee是开源中国推出的基于git的代码托管服务…

.Net Core项目在linux部署实战 1.sdk下载 2.环境变量配置 3.运行

1)下载.net core sdk https://download.visualstudio.microsoft.com/download/pr/01292c7c-a1ec-4957-90fc-3f6a2a1e5edc/025e84c4d9bd4aeb003d4f07b42e9159/dotnet-sdk-6.0.418-linux-x64.tar.gz 2)配置下环境变量 step1: // 解压到指定目录 mkdir -p $HOME/dotnet &…
最新文章