ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C++ 第 10 课:函数 Function

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);是什么意思
返回列表