尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++ 第 10 课:函数 Function
上一课标准答案输出0 1 2因为当i 3时执行break;整个循环直接结束。输出0 1 2 4因为当i 3时continue;只跳过这一轮所以后面的4还会继续执行。最大区别break 整个循环直接结束 continue 只跳过当前这一轮下一轮继续这段代码int i 0; while (i 5) { if (i 2) { continue; } i; }当i增加到2后continue;会导致下面的i;被跳过。于是i永远等于2i 2 ↓ 2 5 ↓ true ↓ continue ↓ i 还是 2 ↓ 继续循环……所以形成死循环。第 10 课函数 Function现在开始进入一个非常重要的新阶段。前面我们的代码都喜欢写在int main() { // 所有代码 }里面。程序稍微复杂一点就会变成int main() { // 读取机械臂状态 // 计算角度 // 判断限位 // 控制电机 // 控制夹爪 // 读取传感器 // 输出日志 // ... }最后可能几百、几千行。这样代码会非常难看懂。所以 C 提供了函数 function1. 函数最直觉的理解你可以把函数理解成给一组操作起一个名字。比如机械臂有一个动作打开夹爪如果不用函数可能每次都要写一堆控制代码。我们可以把这些代码打包起名openGripper()以后想打开夹爪只需要openGripper();就行了。所以函数 ≈ 一段有名字、可以重复使用的代码2. 生活类比你去咖啡机按“制作咖啡”你不会自己执行磨豆 加热水 控制压力 萃取 停止你只按一个按钮制作咖啡()咖啡机内部帮你执行一整套步骤。函数就是这种感觉。3. 第一个最简单的函数看#include iostream void sayHello() { std::cout Hello std::endl; } int main() { sayHello(); return 0; }这已经出现很多新东西了我们一点点拆。4.sayHello()是什么这里sayHello是我们自己起的函数名。和变量名字类似int age;变量叫age而sayHello()函数叫sayHello括号()表示这是一个函数。5. 这一整块是在“定义函数”void sayHello() { std::cout Hello std::endl; }可以理解为我现在创建一个函数它的名字叫sayHello。函数内部要做的事情是std::cout Hello std::endl;所以sayHello() ↓ 输出 Hello6.void是什么这里出现void先把它理解成这个函数执行完以后不需要返回一个结果。你之前见过int main()里面的int表示这个函数会返回一个整数。所以最后有return 0;而void sayHello()表示sayHello只负责做事情不返回数据。暂时记void 没有返回值7. 什么叫“调用函数”定义好void sayHello() { std::cout Hello std::endl; }以后在main()里面sayHello();这叫调用函数意思是去执行sayHello函数里面的代码。所以int main() { sayHello(); return 0; }执行顺序进入 main ↓ 遇到 sayHello() ↓ 跳到 sayHello 函数 ↓ 输出 Hello ↓ sayHello 执行结束 ↓ 回到 main ↓ return 08. 如果调用三次呢int main() { sayHello(); sayHello(); sayHello(); return 0; }输出Hello Hello Hello这就是函数的一个巨大作用同一段代码可以重复使用。9. 开始往机械臂靠我们可以写void stopMotor() { std::cout Motor stopped std::endl; }然后int main() { stopMotor(); return 0; }未来真实代码里stopMotor();内部可能不是打印文字而是发送 CAN 指令 ↓ 目标速度设为 0 ↓ 驱动器停止电机但是上层代码只需要看到stopMotor();马上就知道停止电机。这就是函数为什么能让工程代码更清晰。10. 为什么不把所有东西写在main()比如int main() { std::cout Read encoder std::endl; std::cout Calculate angle std::endl; std::cout Move motor std::endl; std::cout Read encoder std::endl; std::cout Calculate angle std::endl; std::cout Move motor std::endl; }非常重复。我们可以变成void controlRobot() { std::cout Read encoder std::endl; std::cout Calculate angle std::endl; std::cout Move motor std::endl; }然后int main() { controlRobot(); controlRobot(); return 0; }结构就清晰很多。11. 函数可以接收数据刚才sayHello()括号里面什么都没有。但以后我们希望让函数根据不同数据做不同事情。例如void moveJoint(int joint) { std::cout joint std::endl; }这里第一次出现int joint放在括号里面。它叫参数 parameter12. 参数是什么你可以把函数想成一个机器输入 ↓ 函数 ↓ 执行某些操作例如void moveJoint(int joint)表示moveJoint需要别人给它一个整数。这个整数会被存到joint里面。13. 调用时给参数例如moveJoint(3);那么相当于把 3 传给 moveJoint ↓ joint 3于是void moveJoint(int joint) { std::cout joint std::endl; }输出314. 完整程序#include iostream void moveJoint(int joint) { std::cout Move joint joint std::endl; } int main() { moveJoint(1); moveJoint(3); moveJoint(6); return 0; }输出Move joint 1 Move joint 3 Move joint 6注意我们只写了一份void moveJoint(int joint)却可以传进去1 3 6不同数据。15. 函数可以有多个参数例如机械臂需要哪个关节 转到多少度。可以写void moveJoint(int joint, double angle) { std::cout Joint: joint std::endl; std::cout Angle: angle std::endl; }调用moveJoint(2, 45.5);意思就是joint 2 angle 45.516. 参数之间为什么有逗号这里void moveJoint(int joint, double angle)两个参数int joint double angle用,分开。就像告诉函数我要给你两样东西。第一个是整数joint第二个是小数angle17. 调用时顺序很重要定义void moveJoint(int joint, double angle)调用moveJoint(2, 45.5);对应关系2 ↓ joint 45.5 ↓ angle所以顺序不能随便乱。18. 机器人里会大量使用这种函数以后你非常可能看到moveJoint(1, 30.0);setSpeed(100.0);openGripper();readEncoder();calculateIK();这些本质都是函数调用。以后你第一次拿到真实机械臂源码时很多代码之所以看起来“陌生”只是因为里面全是别人定义好的函数名。例如robot.connect(); robot.enable(); robot.moveJoint();后面学类的时候我们会解释为什么前面又多了robot.现在先别管。19.void函数目前的结构现在记住最简单格式void 函数名() { 函数要执行的代码 }例如void stopRobot() { std::cout Stop std::endl; }如果有参数void 函数名(类型 参数名) { }例如void setSpeed(double speed) { std::cout speed std::endl; }20. 一个小机械臂程序#include iostream void moveJoint(int joint, double angle) { std::cout Move joint joint std::endl; std::cout Target angle angle std::endl; } void stopRobot() { std::cout Robot stopped std::endl; } int main() { moveJoint(1, 30.0); moveJoint(2, 45.0); stopRobot(); return 0; }你现在已经能大概读懂进入 main ↓ 调用 moveJoint 把 1 和 30.0 传进去 ↓ 再调用 moveJoint 把 2 和 45.0 传进去 ↓ 调用 stopRobot ↓ 程序结束这已经开始非常像工程程序的结构了。本课小练习第 1 题void hello() { std::cout Hi std::endl; } int main() { hello(); hello(); return 0; }输出几次Hi第 2 题void printNumber(int number) { std::cout number std::endl; } int main() { printNumber(5); }输出什么第 3 题下面void moveJoint(int joint, double angle)有几个参数它们分别是什么类型第 4 题用自己的话解释moveJoint(2, 30.5);是什么意思
RELATED

相关推荐

DeepSeek桌面版Agent实战:从API接入到插件加载的完整踩坑记录

DeepSeek桌面版Agent实战:从API接入到插件加载的完整踩坑记录

1. 抢跑一个还没官宣的桌面客户端,我到底在折腾什么前几天刷社区的时候看到有人在讨论 DeepSeek 可能要出桌面版,官方渠道一点动静都没有,但热词里已经冒出了 "deepseek hermes 桌面版"、"deepseek harness 桌面版"、&qu…

📅 2026/10/1 21:33:36
端侧AI部署的九大约束与八维评测:没有免费午餐的工程实践

端侧AI部署的九大约束与八维评测:没有免费午餐的工程实践

1. 端侧AI到底在“横切”什么“端侧AI”这个词这两年热得发烫,但真正在一线做过硬件部署的人都知道,它跟云端AI完全是两码事。云端你可以堆算力、堆显存、堆带宽,模型跑不动就加卡,延迟高了就加节点,本质上是一个“资源…

📅 2026/10/1 21:33:36
ensp实验避坑全指南:从安装报错40到OSPF/BGP与防火墙配置

ensp实验避坑全指南:从安装报错40到OSPF/BGP与防火墙配置

每年总能在各种群里看到同一个画面:有人发一张ensp报错40的截图,说设备启动失败;有人问USG6000V一直刷井号是不是没救了;还有人在交作业前急急忙忙求助,说ensp实验报告的拓扑图跑不通,只能借别人的截图凑数…

📅 2026/10/1 21:33:36
MORE NEWS

更多资讯

📰

Docker -- 构建nacos镜像

配置信息application.properties nacos配置参考文件spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://ruoyi-mysql:3306/ry-config?characterEncodingutf8&connectTimeout1000&socketTimeout3000&autoReconnecttrue&useUnicodetrue&useSSL…

📰

在线鲜花电商平台开发实战:SpringBoot+Vue+AI大模型全解析

做鲜花电商这个项目之前,我其实有点轻视它——市面上商城类的开源项目一抓一大把,换个商品类目而已,能玩出什么花?真正把需求理完、把代码写起来之后,我才发现自己错得离谱。鲜花的商品属性跟数码、服饰、图书完全是两…

📰

Redis安装配置与核心功能实战指南:跨平台避坑手册

我们直接进入正题。在本地环境搞定Redis安装和基本使用,看起来是特别简单的事,网上教程一抓一大把,但实际自己动手时,你会发现坑比想象中多得多。Windows下版本选择混乱、Linux下编译环境缺依赖、密码配置完居然不生效、可视化工具…

📰

OTFS信道估计:面向高速移动场景的延迟-多普勒域稀疏建模与LS实现

简介:本资源聚焦OTFS(正交时频空间)通信系统中的核心环节——信道估计,面向无线通信方向的研究生、科研人员及5G/6G算法工程师,解决高速移动场景下多普勒频移严重、时变信道建模难、估计精度低等实际问题。压缩包共69个…

📰

wifit3 RxReaderThread设计:专职读线程如何避免USB FIFO溢出(完整指南)

wifit3 RxReaderThread设计:专职读线程如何避免USB FIFO溢出(完整指南) 【免费下载链接】wifit3 Wifite but USB-only & cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3 wifit3 是一个跨平台的 USB Wi…

📰

LabVIEW监控系统架构设计与实践:从数据采集到打包部署

接到一套环境监控系统的需求时,我最头疼的往往不是设备本身,而是上位机软件怎么写。设备厂家的Demo程序一般只能看个实时数值,数据多了就卡,存个历史记录还得靠外部软件,换个型号的设备又得改代码。这几年用LabVIEW陆续…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬