当前位置: 首页 > news >正文

C++函数

 

转载知呼大佬06 - C++函数 - 知乎 (zhihu.com)

06 - C++函数

 

本期我们讨论的是 C++ 中的函数。

函数到底是什么呢,函数就是我们写的代码块,被设计用来执行特定的任务,以后我们学习 class 类的时候,这些块会被称为方法,但是当我说到函数时,我们讲的可不是 C++ 类里面的 方法。

01 函数能干什么

对我们来说,使用函数是很常见的,避免代码重复。我们不想重复写相同的代码,当然,如果我们也可以复制和粘贴很多代码,但会导致巨大的混乱,这也意味着如果我们决定改变一些代码,我们必须在所有这些地方改变它,我们粘贴的地方,那维护这些代码简直就是灾难,所以我们把我们要做的事情写成一个函数,然后可以多次调用它。

如果需要的话,你可以认为函数有一个输入,一个输出,尽管他们可能并不需要这么做。我们可以为函数提供一定的参数,函数可以为我们返回值。

02 定义函数

假设我们想把两个数相乘,我们想写出这样的一个函数。

 

format,png

我们对上面的代码做一些详细的解释。

首先写的是所谓的返回值 int,也就是说,这就是这个函数的返回类型,因为是两个整数相乘,这当然会得到一个整数 ;然后给出函数名 multiply ,它有两个参数 a 和 b ,这些就是我们要乘的数,它们的类型都是 int。然后给出函数体,它会返回 a*b 。

这样你就得到一个函数,它有两个都是整数的参数,该函数的功能是返回两者的乘积。

我们不一定非要提供参数,例如,我可以不提供任何参数,直接返回 5*8 ,这仍然是一个返回整数的函数,但它没任何参数。

 

format,png

我们也可以让函数不返回任何东西,我们通过写 void 作为返回类型来实现,void 意思是啥也没有,所以我们可以这样做。

 

format,png

03 调用函数

如何调用这个函数呢?调用一个函数非常简单,我们直接看下面的例子。

 

format,png

对上面的代码我们做一些解释。

首先我们定义了一个变量 result,来装这个结果,然后直接写函数的名字加括号就可以完成调用函数,括号里面的数字就是函数需要的两个参数,返回值 result 保存 a*b 的结果,最后我们将结果输出到控制台。按 F5 来运行程序,你可以看到我们得到显示是6,也就是2乘以3的结果。

04 为什么要用函数

所以,为什么要用函数呢?看起来代码还更多了一些。

让我们把情况说的更详细些,假设我要做一堆的乘法,我想把它们都记录到控制台,在没有函数的情况下,下面的情况这样看起来会很乱。

 

format,png

如果你运行了这些代码,你会发现我犯了一些错误,我想说的是,其实这种情况经常发生。人们复制和粘贴代码块, 然后忘记改变一个小细节,在某些情况下程序如果正常运行的话,你就有可能注意不到,直到它在某个地方出错了,你才会知道。

(你不会还没发现错在哪里吧?)

让我们修正这些代码。

 

format,png

这样我们会得到正确的结果。

上面的多段代码大部分内容基本差不多,基本的区别就是参与乘法的数字不同。这就很难受了。

让我们为这个重复的过程创建一个函数。

先分析一下具体的需求。这个函数应该不需要返回值,它只需要输出一些信息;这个函数需要两个参数,就可以完成每段代码中不同的部分;为了直观的联想到函数的功能,函数的名字就叫做 MultiplyAndLog 吧,然后我们就有了下面这个函数。

 

format,png

函数定义好后,我们要做的就是调用这个函数。

 

format,png

如果启动这个程序, 你可以看到,在这里可以获得正确的值,这是一个很简单的例子,我们获得了一个非常干净、易于阅读的程序。

通过以上给分析过程,我们有效地证明了函数是真的非常重要的。你的目标应该是将你的代码分开成很多函数。

然而, 有一件事我想强调,也不要把你的代码每一行都拆成函数,对任何人都没有好处的代码,这很难维护,您的代码将看起来凌乱不堪,它会让你的程序变慢。

原因是每次我们调用函数时,编译器生成一个call 指令,这基本上意味着,在一个运行的程序中,我们需要创建一个堆栈结构,这意味着我们必须把像参数这样的东西推进堆栈,我们还需要将一个叫做返回地址的东西,然后我们要做的是跳到二进制执行文件的不同部分,以便开始执行我们的函数指令。为了将 push 进去的结果返回,我们得回去到最初调用函数之前。就像在内存中跳跃来执行函数,跳跃和执行这些都需要时间,这些会减慢我们的程序。当然前提是保持我们当前的函数是作为一个实际的函数,而不是做内联inline的工作(我们会在未来深入讨论内联)。

我说这些都是因为不想让你们对于每一行代码都去创建函数,不要做那么搞笑的事情,编码多了你才能明白哪里你会需要一个函数,但基本上如果你看到自己在多次做一项共同的任务,那么基本可以为此创建一个函数,函数的主要目的是防止代码重复,我们不希望复制粘贴代码。

05 其他的

现在我们回到代码中,有些小伙伴会发现一个细节,main 函数需要返回 int 类型的值,可是在 main 函数体中却找不到 return 关键字。这样操作是合理的吗?

然我们做一个修改,验证一些东西。

 

format,png

Ctrl+F7 编译,我们得到了一个错误。

 

format,png

看起来有返回类型的函数的确必须有返回值。

原因是主函数实际上是一个特殊函数,只有主函数被豁免可以不返回值,它会自动假设你返回0。其他的函数必须要返回值。 main函数不写返回值的操作只是现代 C 和C++ 的一个特性,可以让你代码保持的干净一点。

好了,我们知道这必须返回一个值,刚才讲的东西实际上 只适用于调试模式,如果我们在release 模式下编译,这里你会看到我们没有得到错误,这并不是说我们现在做的是正确的,因为如果我们真的要拿返回值值做某些事情的话,我们会得到 “未定义的行为” 的报错信息,只是编译器不会报错,但是在调试模式下,编译器就会显示出错。

后话

好了,这是一个基本的函数介绍,函数真的很有用。未来我还会写很多函数,每个程序都是由一系列函数组成的,所以这是非常重要的,如果你不认为你完全理解函数是如何工作的,不用担心, 因为在这个系列中我们会写超级多的函数,你会掌握它的,最好的学习方法当然是多练习是吧。我们通常还将函数分解为声明和定义,声明通常存储在头文件中,我们在转换单元或 CPP 文件中编写定义,我将专门制作关于头文件的一期,在那里会讲到在头文件中函数如何声明。

 

 

相关文章:

C++函数

转载知呼大佬06 - C函数 - 知乎 (zhihu.com) 06 - C函数 本期我们讨论的是 C 中的函数。 函数到底是什么呢,函数就是我们写的代码块,被设计用来执行特定的任务,以后我们学习 class 类的时候,这些块会被称为方法,但是…...

设计模式-命令模式-笔记

“行为变化”模式 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 经典模式:Command、Visitor 动机&#xff0…...

酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?

过去两年酒店行业加速洗牌,“强者恒强”的马太效应正持续凸显。 报告显示,2022年排名前10名的酒店集团分别为锦江国际、华住、首旅如家、格林、东呈集团、尚美数智、亚朵、德胧、逸柏、都市酒店。以上10家酒店集团客房规模在连锁酒店市场占有率为62.36&…...

[hive] posexplode函数

在Hive SQL中,posexplode是一个用于将数组(array)拆分为多行的函数。 它返回数组中的每个元素以及其在数组中的位置(索引)作为两列输出。 这是posexplode函数的语法: posexplode(array)其中,…...

C#具名参数(Named Parameters)

在 C# 中,具名参数(Named Parameters)是一种在方法调用中使用参数名称来指定参数值的技术。通常情况下,我们使用位置参数(Positional Parameters)来按照方法参数的顺序传递参数值。但是,使用具名…...

Vue3的组件如何通讯

一、defineProps&#xff0c;defineEmits 子组件nameChange.vue <template><div class"title">姓&#xff1a;{{ firstName }}</div><div>名&#xff1a;{{ lastName }}</div>{{ name }}<button click"clickTap">传…...

MySQL SUBSTRING_INDEX 函数用法

定义和用法 SUBSTRING_INDEX()函数在指定数量的分隔符出现之前返回字符串的子字符串。 语法 SUBSTRING_INDEX(string, delimiter, number) 参数值 参数 描述 string 必须项。原始字符串 delimiter 必须项。要搜索的分隔符 number 必须项。搜索分隔符的次数。可以是正…...

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法&#xff0c;通过引入故障来找到系统的bug&#xff0c;验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …...

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…...

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

go 判断两棵树内容是否一致

goroutine http://127.0.0.1:3999/concurrency/8 question 使用 go 判断 两个 树 存放的 序列 是否 相同, 如果 相同 他们 被称为 equivalent_tree tree struct type Tree struct {Left *TreeValue intRight *Tree }由于 递归的 写法 比较简单, 此处 使用循环的 形式 来实…...

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…...

Vue 前置 后置 路由守卫 独享 路由权限控制 自定义属性

import Vue from vue import VueRouter from vue-router //导入路由器 Vue.use(VueRouter)import Login from ../components/Login import User from ../components/User //导入需要路由的组件const router new VueRouter({//暴露出去使用routes:[{path: /login,component: Lo…...

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的…...

go语言学习之旅之Go语言基础语法二

学无止境&#xff0c;今天继续学习go语言的基础语法 变量&#xff08;Variables&#xff09;: 变量声明&#xff1a; var x int变量初始化&#xff1a; var x int 10或者可以使用类型推断&#xff1a; x : 10多变量声明&#xff1a; var a, b, c int同时初始化多个变量&#…...

七天.NET 8操作SQLite入门到实战 - SQLite 简介

什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个小型的C语言库的形式存在。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&#xff0c;在嵌入式设备中&#xff0c;可能只需要几…...

问题 R: 胜利大逃亡(HUST)

#include <deque> #define inf 200000 #include<iostream> #include<queue> using namespace std;// 迷宫坐标 int map[59][59][59] { 0 };// 可访问标记 int visit[51][51][51] { 0 }; // 移动方式 int next1[7][4] { {1,0,0},{-1,0,0}, {0,1,0},{0,-1,…...

项目讲解:让你在IT行业面试中以开发、实施、产品更近一步

1、会议系统项目 项目介绍 提示&#xff1a;可以简单介绍IT技术发展的背景 面试准备 开发 实施 产品 2、医疗项目 项目介绍 提示&#xff1a;可以谈谈你认为IT行业就业方向有哪些&#xff0c;并说出你认为最好的就业领域是什么&#xff1f; 面试准备 开发 实施 产品 3、数字化交…...

Windows 安装 Docker

目录 前言安装 WSL2WSL2 简介系统要求安装步骤 安装 Docker Desktop下载安装验证 安装 Docker Compose结语开源项目 前言 下图展示了在 Windows 系统上安装 Docker&#xff0c;并利用Docker Compose一键搭建 youlai-mall 微服务商城所需的环境。本篇将先介绍 Windows 上如何安…...

AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片

一、前言 三星堆文化是一种古老的中国文化&#xff0c;它以其精湛的青铜铸造技术闻名&#xff0c;出土文物中最著名的包括青铜面具、青铜人像、金杖、玉器等。这些文物具有独特的艺术风格&#xff0c;显示了高度的工艺水平和复杂的社会结构。 青铜面具的巨大眼睛和突出的颧骨&a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...