新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++ 第 10 课:函数 Function

发布时间:2026/10/1 21:38:24来源:尧图网络
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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Springboot上门护理服务预约系统设计与实现全解析 2026/10/1 22:40:20

Springboot上门护理服务预约系统设计与实现全解析

上门护理服务预约系统,说白了就是把“预约护士上门”这件事从电话、微信里搬到线上,让用户能自己选服务、选护士、选时间,护士可以在手机上接单,管理员能统一管订单和人员。我之前带学生做过一个Springboot版本,前后忙…

阅读更多 →
C# WinForm数据库备份恢复实战:SQL Server与文件级双路径 2026/10/1 22:40:12

C# WinForm数据库备份恢复实战:SQL Server与文件级双路径

简介:本资源是一份面向C# WinForm桌面应用开发者的数据库运维实践Demo,聚焦数据库备份与恢复两大核心场景,适用于企业级数据安全方案设计、教学演示及项目容灾功能开发。资源完整实现两种主流技术路径:基于SQLDMO组件的COM对象调用…

阅读更多 →
OpenCV形态学与连通域分析:从腐蚀膨胀到工业缺陷检测 2026/10/1 22:40:12

OpenCV形态学与连通域分析:从腐蚀膨胀到工业缺陷检测

形态学这套操作,我最早是在做工业质检的板卡缺陷检测项目时被逼着啃透的。那时候客户给的图光照不均、反光严重,阈值分割出来的二值图满是毛刺和孤立噪点,用高斯滤波一抹,边缘糊成一片,缺陷的尺寸和形状全丢了。后来换…

阅读更多 →
MCP协议安全风险全解析:统一接口背后的六大隐患与防护实践 2026/10/1 22:40:12

MCP协议安全风险全解析:统一接口背后的六大隐患与防护实践

先打个比方,MCP 协议在 AI 生态里的位置,很像 USB-C 接口在数码设备里的位置:一个统一标准,把充电、数据传输、视频输出全收编了。对开发者来说,MCP 就是 AI 应用的 USB-C——模型要连数据库、调 API、读文件、操作办公…

阅读更多 →
Pogo Pin压缩裕量分析:用Python揪出多针阵列风险针位 2026/10/1 22:39:59

Pogo Pin压缩裕量分析:用Python揪出多针阵列风险针位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Flutter牵手Apple Watch:跨端桥接实战与架构解析 2026/10/1 22:39:59

Flutter牵手Apple Watch:跨端桥接实战与架构解析

如果你手里有一块 Apple Watch,想在上面跑一个用 Flutter 写的交互界面,我猜你大概率会先去 pub.dev 搜一圈 watchOS 相关的包,然后发现官方压根没有支持。这个项目其实挺有意思的:Flutter 的跨端优势在手机和平板上确实香&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉