[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-home-live-entry-setting":3,"site-header-contests":8,"site-header-camps":49,"study-material-detail-study-55":104},{"enabled":4,"title":5,"statusText":5,"buttonText":5,"campSlug":5,"stage":6,"classroomId":7,"hasClassroom":4},false,"",0,null,{"total":9,"list":10,"pageNum":44,"pageSize":45,"size":9,"startRow":44,"endRow":9,"pages":44,"prePage":6,"nextPage":6,"isFirstPage":46,"isLastPage":46,"hasPreviousPage":4,"hasNextPage":4,"navigatePages":47,"navigatepageNums":48,"navigateFirstPage":44,"navigateLastPage":44},3,[11,25,35],{"slug":12,"title":13,"logo":7,"liveUrl":14,"prize":15,"sponsor":16,"description":17,"organizer":18,"startTime":19,"endTime":20,"registrationDeadline":21,"status":22,"dashboardVisibility":23,"createdAt":24},"spring2026","2026春季启元人工智能大赛","https:\u002F\u002Fwww.bilibili.com\u002Fblackboard\u002Flive\u002Flive-activity-player.html?cid=1822703816&quality=0","200,000","麒麟软件有限公司","“2026春季启元人工智能大赛”是由启元实验室主办的面向全国人工智能领域开发者、科研人员及高校学生的权威赛事。大赛旨在促进与培养具备工程实践能力和创新能力的优秀人工智能领域开发者、推广国产软硬件技术与生态、助力国家人工智能产业高质量发展。\n各参赛选手需在规定的比赛周期内，依据赛事规则选定赛题并完成相应挑战，优胜者将共同角逐总额20万元的赛事奖金池，并且还将有机会获得实习和知名企业优质岗位内推资格。","启元实验室","2026-04-19 16:00:00","2026-07-13 16:00:00","2026-06-16 16:00:00","ongoing","private","2026-04-16 08:00:00",{"slug":26,"title":27,"logo":7,"liveUrl":14,"prize":28,"sponsor":7,"description":29,"organizer":18,"startTime":30,"endTime":31,"registrationDeadline":32,"status":33,"dashboardVisibility":23,"createdAt":34},"autumn2025","2025秋季启元人工智能大赛","150,000","“2025秋季启元人工智能大赛”是由启元实验室主办的面向全国人工智能领域开发者、科研人员及高校学生的权威赛事。大赛旨在促进与培养具备工程实践能力和创新能力的优秀人工智能领域开发者、推广国产软硬件技术与生态、助力国家人工智能产业高质量发展。","2025-11-08 08:00:00","2026-01-13 08:00:00","2025-12-30 08:00:00","ended","2025-11-03 08:00:00",{"slug":36,"title":37,"logo":7,"liveUrl":14,"prize":38,"sponsor":7,"description":39,"organizer":18,"startTime":40,"endTime":41,"registrationDeadline":42,"status":33,"dashboardVisibility":23,"createdAt":43},"summer2025","启元人工智能大赛(系统方向)","80,000","启元人工智能大赛由启元实验室主办，其中系统赛道基于启元实验室九源软件栈的相关开源项目，通过拉动开源社区力量，一方面促进国产智能计算生态的发展，另一方面也为人工智能系统方向的学生及从业者提供一个实践平台。","2025-07-08 08:00:00","2025-08-25 08:00:00","2025-07-22 08:00:00","2025-06-22 08:00:00",1,5,true,8,[44],{"total":45,"list":50,"pageNum":44,"pageSize":45,"size":45,"startRow":44,"endRow":45,"pages":44,"prePage":6,"nextPage":6,"isFirstPage":46,"isLastPage":46,"hasPreviousPage":4,"hasNextPage":4,"navigatePages":47,"navigatepageNums":103,"navigateFirstPage":44,"navigateLastPage":44},[51,62,73,84,94],{"id":52,"slug":53,"title":54,"logo":55,"publicLiveEmbedUrl":14,"description":56,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":16,"startTime":58,"endTime":59,"status":22,"dashboardVisibility":60,"createdAt":58,"updatedAt":61},"019eeeff-6b00-7d55-a629-efafded3e232","summer2026","2026年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2026-06\u002F019eef7f-7816-7828-9309-79c2c61dd568.jpg?Expires=1792752821&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=YuOgm%2FgmD4nuySjwNMl5nm0fmKI%3D","由启元实验室发起的InfiniTensor大模型与人工智能系统训练营，面向开源社区、高校及产业界伙伴开放。活动以「普及AI全栈知识技术、培养工程实践与创新型人才、推广国产软硬件技术生态」为核心目标，助力国家人工智能产业高质量发展。","...","2026-06-22 08:00:00","2026-10-19 08:00:00","public","2026-10-12 08:00:00",{"id":63,"slug":64,"title":65,"logo":66,"publicLiveEmbedUrl":7,"description":67,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":68,"startTime":69,"endTime":70,"status":33,"dashboardVisibility":23,"createdAt":71,"updatedAt":72},"019af3f3-e06a-7245-aa8d-37dc99a69c73","winter2025","2025年冬季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2025-12\u002F019afc69-b7ca-7805-91fb-605429671c01.png?Expires=1792752821&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=Kxv2UTqtU0%2FwvYQCDERqdg0W6E4%3D","由启元实验室发起的InfiniTensor大模型与人工智能系统训练营，面向开源社区、高校及产业界伙伴开放。活动以「普及AI全栈知识技术、培养工程实践与创新型人才、推广国产软硬件技术生态」为核心目标，助力国家人工智能产业高质量发展。 \n","新华三技术有限公司","2025-12-25 08:00:00","2026-03-27 08:00:00","2025-12-06 08:00:00","2026-10-22 20:24:30",{"id":74,"slug":36,"title":75,"logo":76,"publicLiveEmbedUrl":7,"description":77,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":78,"startTime":79,"endTime":80,"status":81,"dashboardVisibility":23,"createdAt":82,"updatedAt":83},"01980342-208c-7803-b3f3-19e1d31960ba","2025年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2025-07\u002F0198045e-28fe-78f0-95fe-23835ce58395.jpg?Expires=1792752821&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=nIij3MTYWjwdhBM00gMTqmyLnUM%3D","InfiniTensor大模型与人工智能系统训练营由启元实验室及清华大学 AI 系统方向团队发起，面向开源社区、高校和产业界，普及人工智能各方面知识和技术，培养相关人才。训练营联合开源项目开发者、学术界大牛、工业界资深工程师参与授课与项目指导。课程采用「线上直播授课 + 在线答疑 + 项目实践辅导 」的方式进行，确保每位同学都能获得充分成长。训练营全程免费，通过视频、直播课、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。","北京积算科技有限公司","2025-07-14 08:00:00","2025-09-30 08:00:00","upcoming","2025-07-13 08:00:00","2026-10-22 20:24:58",{"id":85,"slug":86,"title":87,"logo":88,"publicLiveEmbedUrl":7,"description":89,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":5,"startTime":90,"endTime":91,"status":81,"dashboardVisibility":23,"createdAt":92,"updatedAt":93},"01980cf9-a7d8-7796-ae86-0bbe05334add","winter2024","2024年冬季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Ftesting-cdn.infinitensor.com\u002Fuploads\u002F2025-07\u002F01981269-ce23-7624-a287-9f07dd0d85f6.jpg","InfiniTensor大模型与人工智能系统训练营由清华大学发起，面向开源社区、高校和产业界，普及人工智能各方面知识和技术，培养相关人才。训练营全程免费，通过视频、直播课、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。报名学员请阅读“导学”课程页的训练营介绍。","2025-01-05 08:00:00","2025-03-22 08:00:00","2025-07-15 08:00:00","2026-10-22 20:24:39",{"id":95,"slug":96,"title":97,"logo":98,"publicLiveEmbedUrl":7,"description":99,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":5,"startTime":100,"endTime":101,"status":81,"dashboardVisibility":23,"createdAt":92,"updatedAt":102},"01980c20-363a-7dc3-8f5a-58a68e08dcc4","summer2024","2024年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Ftesting-cdn.infinitensor.com\u002Fuploads\u002F2025-07\u002F01981269-fbfa-788a-afcd-17fa9be74ff9.jpg","InfiniTensor大模型与人工智能系统训练营由清华大学发起，面向开源社区和高校，普及人工智能各方面知识和技术，培养相关人才。训练营全程免费，通过课程、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。","2024-07-20 08:00:00","2024-09-29 08:00:00","2026-10-22 20:24:49",[44],{"currentItem":105,"processedData":124},{"img":106,"keywords":5,"treeType":44,"description":107,"showStatus":44,"updateTime":108,"type":109,"title":110,"content":111,"nextArticle":112,"createTime":108,"sortOrder":116,"canonicalPath":117,"id":118,"contentType":119,"prevArticle":120},"https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fimages\u002FKnowledge_Base\u002FKB_55_fm.jpg?Expires=1792752821&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=2%2BP8N3NHnhFkfk6FLrH03Rgx4%2F8%3D","2025 InfiniTensor 冬季训练营 C++ 实践第2课：从简易计算器升级切入，详解函数模块化、参数引用传递、Git 版本管理、代码风格规范、const 修饰符、数组与循环遍历、函数返回值、结构体封装及 getline \u002F stringstream 变长输入解析。","2026-10-22 20:38:11",2,"2025 冬季 InfiniTensor 训练营｜C++ 实践课（二）",">上节课我们用C++写了一个简易计算器，这节课直接升级——函数拆分、Git版本管理、数组、结构体……干货拉满，建议收藏反复看。\r\n\r\n## 上节课回顾：我们做到了哪一步？\r\n上节课，我们用 C++ 完成了一个支持加减法的简易计算器，包含 `main` 函数和 `input` 函数，能连续运行三次后自动退出。\r\n\r\n到目前为止，我们已经解锁了这些技能👇\r\n\r\n| 技能 | 说明 |\r\n| --- | --- |\r\n| 命令行基础 | 历史记录查看、`cd`切换目录等 |\r\n| C++ 基本输入输出 | `cin`读输入、`cout`出结果 |\r\n| & 代码编译运行 | g++ 编译源代码为可执行程序 |\r\n| 条件判断 | `if` \u002F `else if` \u002F` else` 分支逻辑 |\r\n| 循环结构 | `while` 循环让程序重复执行 |\r\n\r\n\r\n>💡 关于 `while` 循环补充一点：当条件满足时进入循环体，执行完回到开头重新判断，直到条件不满足才退出。调试时强制退出按 Ctrl+C。\r\n⚠️ 上节课演示时计数器 `count` 设为 3，只是为了展示循环判断效果。实际项目中通常会使用持续运行的循环，直到用户主动退出程序。\r\n\r\n## 函数模块化：\u003Cbr>别把所有代码放在 main 里\r\n### 为什么要拆函数？\r\n上节课的 `input` 函数又管输入又管计算，功能杂糅。从实际开发角度看，这远远不够。\r\n\r\n定义函数有两个核心目的：\r\n\r\n- **模块化** —— 程序越来越大时，如果所有代码都堆在 `main` 里，维护起来就是噩梦。把不同功能拆到独立函数，结构清晰得多。\r\n- **为递归铺路** —— 递归（函数调用自身）是编程中非常重要的概念，模块化思维是理解它的基础。\r\n\r\n### 怎么拆？\r\n`input`:专注用户交互，读取运算符和操作数;\r\n`calculate`:专注运算逻辑，执行具体计算\r\n\r\n### 参数传递：函数之间怎么\"传话\"？\r\n`main` 和 `input` 处于不同的作用域，各自定义的变量互不可见。要共享数据，必须通过参数显式传递。\r\n\r\n将参数以引用传递后，函数就能访问和修改外部变量了。调用流程：\r\n`input` 获取输入 → 存入 `main` 的变量 → `calculate` 从变量中读取数据进行计算。\r\n\r\n## Git 版本管理：程序员的\"时光机\"\r\n### 版本管理是什么？\r\n你用过飞书文档、腾讯文档的历史记录功能吗？可以查看每个时间段的编辑内容，不满意就回退到之前的版本。\r\n\r\n在 Git 出现之前，只能手动存副本：`2022_11.docx` → `2022_12.docx`……\r\n想回退？翻文件夹翻到崩溃。\r\n\r\nGit 就是为了解决这个问题而生的——自动记录和管理每一个版本。\r\n\r\n### 从零搭建：四步走\r\n\r\n| 步骤 | 命令 | 作用 |\r\n| --- | --- | --- |\r\n| ① 初始化仓库 | `git init` | 把当前目录纳入版本管理 |\r\n| ② 添加到暂存区 | `git add main.cpp` | 文件变绿，等待提交 |\r\n| ③ 提交 | `git commit -m '添加简单计算器功能'` | 记录一个版本快照 |\r\n| ④ 查看历史 |` git log` | 查看所有提交记录（含哈希值、时间、说明） |\r\n\r\n>⚠️ `git add` 和 `git commit `为什么要分开？\r\n✅选择性提交：一个文件改了多处，只把需要的部分加到暂存区\r\n✅ 养成好习惯：每完成一个小功能就暂存，最后整合提交，方便追踪和回滚\r\n\r\n🚫 **编译产物别提交！**\r\n可执行文件（如 `main`）不要纳入版本控制，原因有二：\r\n①占空间 —— GitHub 等平台对仓库大小有限制\r\n②不可移植 —— Linux 编译的 `main` 在 Windows 上跑不了，只需将源代码纳入版本控制，实际使用时在现场编译即可。\r\n\r\n## 代码风格：能跑不等于能看\r\n### 代码可读性有多重要？\r\n理论上，只要符合语法，你把代码全写一行、缩进随意、换行随心所欲，程序照样能跑。\r\n\r\n但别人看你的代码时，内心是崩溃的。 😱\r\n\r\n格式混乱 = 维护噩梦 = 协作灾难。所以，必须遵循统一的代码风格规范。\r\n\r\n### 常见风格指南\r\n\r\n| 指南 | 来源 | 特点 |\r\n| --- | --- | --- |\r\n| Google C++ Style Guide | Google | 文件命名、变量命名等细节规定详尽 |\r\n| LLVM Coding Standards | LLVM 项目 | 包含头文件引用等原则 |\r\n| Linux Kernel Coding Style | Linux 内核 | C 语言编码规范 |\r\n\r\n细节各异，但核心都是两个字：**一致**。\r\n\r\n### 基本格式规范\r\n- **命名统一**：如驼峰式 nMakeAlphaCheck 或 下划线分隔式 with_underscore，选一种全项目贯彻；\r\n- **行长度 ≤ 80 字符**：太长得左右滚动，眼睛受罪；\r\n- **缩进统一**：推荐 4 个空格（Tab 也行，关键是一致）；\r\n- **花括号位置统一**：同行或另起一行，选定就别变。\r\n\r\n### 自动化格式化：clang-format\r\n手动调格式太累？用工具！有了自动格式化工具，写代码时可以先专注逻辑，最后一键整理格式，效率拉满：\r\n\r\n- **clang-format**：LLVM 出品，在项目根目录放 `.clang-format` 配置文件，一键格式化；\r\n- **VS Code**：快捷键 `Shift+Alt+F`，或者命令面板搜 `Format Document`\r\n\r\n## const 修饰符：\u003Cbr>告诉编译器\"这个别动\"\r\n### const 是什么？\r\n`const` = constant（常量\u002F不变的）。加在参数前，就是告诉编译器：这个参数我只读不改，你帮我盯着，谁改就报错。\r\n\r\n### 什么时候加？什么时候不加？\r\n`input`不加：要修改参数（写入用户输入）。\r\n`calculate`加：只读取参数做计算，不应修改。\r\n\r\n>除非必须修改，否则尽量用 `const`。\r\n代码意图更清晰，bug 更容易被发现。\r\n\r\n## 数组：装下不止两个数\r\n目前的计算器只能处理两个数。要是想算 1+2+3+4+5 呢？总不能无限加参数 x, y, z, a, b, c... 吧？\r\n\r\n#### 数组（Array）来了！\r\n```cpp\r\ndouble numbers[2];  \u002F\u002F 存2个double类型的数据\r\n```\r\n#### 关键知识点\r\n\r\n| 要点 | 说明 |\r\n| --- | --- |\r\n| 索引从 0 开始 | `numbers[0]`是第一个，`numbers[1] `是第二个（不是 1！） |\r\n| 数组名 = 指针 | 数组名本质上指向内存首地址，`numbers[i]` = 首地址 + i × 元素大小 |\r\n| 传参时大小可省略 | `double numbers[]` 或 `double* numbers` 都行 |\r\n\r\n>💡 **编程习惯：最小化替代原则。** 修改代码时，先用最小改动让程序能跑，再逐步扩展。别一次性改太多，否则出了 bug 都不知道是哪里的问题。\r\n\r\n## 循环遍历数组：while vs for\r\n### `while` 循环遍历\r\n用 `while` 循环配合索引变量，可以逐个访问数组中的所有元素。定义一个整数变量 `i` 作为索引，初始值为 0，每次循环后递增，直到 `i` 达到数组长度为止。\r\n>⚠️ 漏了`i++` = 无限循环 = 程序假死，跟 `while(true)` 一个效果。所以**循环体里一定要有索引递增的语句**，否则 i 值永远不变，循环条件永远为真。\r\n\r\n### `for` 循环：更优雅的选择\r\nfor循环的优势：\r\n\r\n- “初始化、条件判断、递增”三合一，结构紧凑；\r\n- 循环变量 `i` 只在循环内部可见，循环结束后自动销毁，避免误用；\r\n- 让变量的作用域更小，代码的模块化程度更高，也更不容易出 bug。\r\n\r\n## 函数返回值：让函数\"交出答案\"\r\n### 返回值的概念\r\n之前的函数都用`void`，表示不返回任何东西。但函数完全可以把计算结果返回给调用者。\r\n\r\n`main` 函数末尾的 `return 0 `也是返回值——0 表示正常结束，非 0 表示异常终止。\r\n\r\n### 求和函数\r\n定义一个 `sum` 函数，返回类型为 `double`，接受数组和长度作为参数。函数内部遍历数组累加所有元素，最终返回求和结果。\r\n这样，`calculate` 函数就不用自己遍历累加了，直接调用 `sum` 拿结果，代码更简洁。\r\n\r\n## 结构体：把相关数据打包在一起\r\n当需要传递的参数越来越多——数组首地址、数组长度、操作符类型……一个个传太麻烦了。**结构体**（Struct） 就是把多个相关数据组合成一个新类型。\r\n\r\n用结构体的好处：\r\n-  **逻辑清晰**：相关数据放一起，一看就懂；\r\n-  **调用简洁**：传一个结构体，而不是一堆零散参数；\r\n-  **可读性强**：`nums.data`、`nums.size`，一目了然。（访问成员用**点运算符**“.”）\r\n\r\n\r\n## 变长输入：用户想输几个数就几个数\r\n### 需求分析\r\n用户输入 1+2+3 回车，程序自动解析出所有数字并求和。数字个数不固定，运行时才决定。\r\n\r\n### 实现方案\r\n①**读整行**：使用 `getline` 函数，把用户输入的整行读进字符串；\r\n②**字符串转流**：使用 `stringstream` 把字符串变成类似 `cin` 的流对象；\r\n③**循环提取**：使用循环配合流提取依次读取每个数字，直到流为空。\r\n\r\n### 注意事项：\r\n\r\n- 头文件建议**显式引入**所有需要的，别依赖隐式包含，跨平台兼容性更好；\r\n- `getline` 读完后，原来的 `cin` 已经被消耗了，必须用 `stringstream` 重新处理；\r\n- 循环提取时，以空格或回车作为分隔符。\r\n\r\n## 课后 Q&A\r\n**Q1：能获取流在原始字符串中的位置吗？**\r\n>流式输入不关心位置。如果需要追踪，建议直接处理字符串——用循环逐个字符遍历，遇到空格截断，再用 `stoi`（字符串转整数）或 `stod`（字符串转浮点数）转换。\r\n\r\n**Q2：转码学 C++ 有什么建议？**\r\n>作为曾经的 EE 转 CS 选手，分享一下自己的经验：\r\n📖 **入门书推荐** 《C++ Primer》，内容全面，适合新手。\r\n🎯 **学习方法**：不要试图一次性学完所有知识点。先学基础 → 立刻动手实践 → 觉得够用了就找个感兴趣的方向开干。\r\n**编程能力主要靠练，看再多书不如写一行代码。** 项目中学到的东西，印象最深，也最实用。",{"publishTime":7,"createTime":108,"canonicalPath":113,"id":114,"title":115},"\u002Fstudy-material\u002Fstudy-54","study-54","2025 冬季 InfiniTensor 训练营｜C++ 实践课（一）",54,"\u002Fstudy-material\u002Fstudy-55","study-55","markdown",{"publishTime":7,"createTime":108,"canonicalPath":121,"id":122,"title":123},"\u002Fstudy-material\u002Fstudy-56","study-56","2025 冬季 InfiniTensor 训练营｜C++ 实践课（三）",{"htmlContent":125,"headings":126},"\u003Cblockquote>\n\u003Cp>上节课我们用C++写了一个简易计算器，这节课直接升级——函数拆分、Git版本管理、数组、结构体……干货拉满，建议收藏反复看。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"上节课回顾-我们做到了哪一步\">\u003Ca class=\"anchor\" href=\"#上节课回顾-我们做到了哪一步\" aria-label=\"跳转到标题：上节课回顾：我们做到了哪一步？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>上节课回顾：我们做到了哪一步？\u003C\u002Fh2>\u003Cp>上节课，我们用 C++ 完成了一个支持加减法的简易计算器，包含 \u003Ccode>main\u003C\u002Fcode> 函数和 \u003Ccode>input\u003C\u002Fcode> 函数，能连续运行三次后自动退出。\u003C\u002Fp>\n\u003Cp>到目前为止，我们已经解锁了这些技能👇\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>技能\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>命令行基础\u003C\u002Ftd>\n\u003Ctd>历史记录查看、\u003Ccode>cd\u003C\u002Fcode>切换目录等\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>C++ 基本输入输出\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>cin\u003C\u002Fcode>读输入、\u003Ccode>cout\u003C\u002Fcode>出结果\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>&amp; 代码编译运行\u003C\u002Ftd>\n\u003Ctd>g++ 编译源代码为可执行程序\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>条件判断\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>if\u003C\u002Fcode> \u002F \u003Ccode>else if\u003C\u002Fcode> \u002F\u003Ccode> else\u003C\u002Fcode> 分支逻辑\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>循环结构\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>while\u003C\u002Fcode> 循环让程序重复执行\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cblockquote>\n\u003Cp>💡 关于 \u003Ccode>while\u003C\u002Fcode> 循环补充一点：当条件满足时进入循环体，执行完回到开头重新判断，直到条件不满足才退出。调试时强制退出按 Ctrl+C。\u003Cbr>⚠️ 上节课演示时计数器 \u003Ccode>count\u003C\u002Fcode> 设为 3，只是为了展示循环判断效果。实际项目中通常会使用持续运行的循环，直到用户主动退出程序。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"函数模块化-别把所有代码放在-main-里\">\u003Ca class=\"anchor\" href=\"#函数模块化-别把所有代码放在-main-里\" aria-label=\"跳转到标题：函数模块化：别把所有代码放在 main 里\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>函数模块化：\u003Cbr>别把所有代码放在 main 里\u003C\u002Fh2>\u003Ch3 id=\"为什么要拆函数\">\u003Ca class=\"anchor\" href=\"#为什么要拆函数\" aria-label=\"跳转到标题：为什么要拆函数？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>为什么要拆函数？\u003C\u002Fh3>\u003Cp>上节课的 \u003Ccode>input\u003C\u002Fcode> 函数又管输入又管计算，功能杂糅。从实际开发角度看，这远远不够。\u003C\u002Fp>\n\u003Cp>定义函数有两个核心目的：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>模块化\u003C\u002Fstrong> —— 程序越来越大时，如果所有代码都堆在 \u003Ccode>main\u003C\u002Fcode> 里，维护起来就是噩梦。把不同功能拆到独立函数，结构清晰得多。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>为递归铺路\u003C\u002Fstrong> —— 递归（函数调用自身）是编程中非常重要的概念，模块化思维是理解它的基础。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"怎么拆\">\u003Ca class=\"anchor\" href=\"#怎么拆\" aria-label=\"跳转到标题：怎么拆？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>怎么拆？\u003C\u002Fh3>\u003Cp>\u003Ccode>input\u003C\u002Fcode>:专注用户交互，读取运算符和操作数;\u003Cbr>\u003Ccode>calculate\u003C\u002Fcode>:专注运算逻辑，执行具体计算\u003C\u002Fp>\n\u003Ch3 id=\"参数传递-函数之间怎么-quot-传话-quot\">\u003Ca class=\"anchor\" href=\"#参数传递-函数之间怎么-quot-传话-quot\" aria-label=\"跳转到标题：参数传递：函数之间怎么&amp;quot;传话&amp;quot;？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>参数传递：函数之间怎么&quot;传话&quot;？\u003C\u002Fh3>\u003Cp>\u003Ccode>main\u003C\u002Fcode> 和 \u003Ccode>input\u003C\u002Fcode> 处于不同的作用域，各自定义的变量互不可见。要共享数据，必须通过参数显式传递。\u003C\u002Fp>\n\u003Cp>将参数以引用传递后，函数就能访问和修改外部变量了。调用流程：\u003Cbr>\u003Ccode>input\u003C\u002Fcode> 获取输入 → 存入 \u003Ccode>main\u003C\u002Fcode> 的变量 → \u003Ccode>calculate\u003C\u002Fcode> 从变量中读取数据进行计算。\u003C\u002Fp>\n\u003Ch2 id=\"git-版本管理-程序员的-quot-时光机-quot\">\u003Ca class=\"anchor\" href=\"#git-版本管理-程序员的-quot-时光机-quot\" aria-label=\"跳转到标题：Git 版本管理：程序员的&amp;quot;时光机&amp;quot;\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>Git 版本管理：程序员的&quot;时光机&quot;\u003C\u002Fh2>\u003Ch3 id=\"版本管理是什么\">\u003Ca class=\"anchor\" href=\"#版本管理是什么\" aria-label=\"跳转到标题：版本管理是什么？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>版本管理是什么？\u003C\u002Fh3>\u003Cp>你用过飞书文档、腾讯文档的历史记录功能吗？可以查看每个时间段的编辑内容，不满意就回退到之前的版本。\u003C\u002Fp>\n\u003Cp>在 Git 出现之前，只能手动存副本：\u003Ccode>2022_11.docx\u003C\u002Fcode> → \u003Ccode>2022_12.docx\u003C\u002Fcode>……\u003Cbr>想回退？翻文件夹翻到崩溃。\u003C\u002Fp>\n\u003Cp>Git 就是为了解决这个问题而生的——自动记录和管理每一个版本。\u003C\u002Fp>\n\u003Ch3 id=\"从零搭建-四步走\">\u003Ca class=\"anchor\" href=\"#从零搭建-四步走\" aria-label=\"跳转到标题：从零搭建：四步走\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>从零搭建：四步走\u003C\u002Fh3>\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>步骤\u003C\u002Fth>\n\u003Cth>命令\u003C\u002Fth>\n\u003Cth>作用\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>① 初始化仓库\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>git init\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>把当前目录纳入版本管理\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>② 添加到暂存区\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>git add main.cpp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>文件变绿，等待提交\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>③ 提交\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>git commit -m &#39;添加简单计算器功能&#39;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>记录一个版本快照\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>④ 查看历史\u003C\u002Ftd>\n\u003Ctd>\u003Ccode> git log\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>查看所有提交记录（含哈希值、时间、说明）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Ccode>git add\u003C\u002Fcode> 和 \u003Ccode>git commit \u003C\u002Fcode>为什么要分开？\u003Cbr>✅选择性提交：一个文件改了多处，只把需要的部分加到暂存区\u003Cbr>✅ 养成好习惯：每完成一个小功能就暂存，最后整合提交，方便追踪和回滚\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>🚫 \u003Cstrong>编译产物别提交！\u003C\u002Fstrong>\u003Cbr>可执行文件（如 \u003Ccode>main\u003C\u002Fcode>）不要纳入版本控制，原因有二：\u003Cbr>①占空间 —— GitHub 等平台对仓库大小有限制\u003Cbr>②不可移植 —— Linux 编译的 \u003Ccode>main\u003C\u002Fcode> 在 Windows 上跑不了，只需将源代码纳入版本控制，实际使用时在现场编译即可。\u003C\u002Fp>\n\u003Ch2 id=\"代码风格-能跑不等于能看\">\u003Ca class=\"anchor\" href=\"#代码风格-能跑不等于能看\" aria-label=\"跳转到标题：代码风格：能跑不等于能看\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>代码风格：能跑不等于能看\u003C\u002Fh2>\u003Ch3 id=\"代码可读性有多重要\">\u003Ca class=\"anchor\" href=\"#代码可读性有多重要\" aria-label=\"跳转到标题：代码可读性有多重要？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>代码可读性有多重要？\u003C\u002Fh3>\u003Cp>理论上，只要符合语法，你把代码全写一行、缩进随意、换行随心所欲，程序照样能跑。\u003C\u002Fp>\n\u003Cp>但别人看你的代码时，内心是崩溃的。 😱\u003C\u002Fp>\n\u003Cp>格式混乱 = 维护噩梦 = 协作灾难。所以，必须遵循统一的代码风格规范。\u003C\u002Fp>\n\u003Ch3 id=\"常见风格指南\">\u003Ca class=\"anchor\" href=\"#常见风格指南\" aria-label=\"跳转到标题：常见风格指南\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>常见风格指南\u003C\u002Fh3>\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>指南\u003C\u002Fth>\n\u003Cth>来源\u003C\u002Fth>\n\u003Cth>特点\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Google C++ Style Guide\u003C\u002Ftd>\n\u003Ctd>Google\u003C\u002Ftd>\n\u003Ctd>文件命名、变量命名等细节规定详尽\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LLVM Coding Standards\u003C\u002Ftd>\n\u003Ctd>LLVM 项目\u003C\u002Ftd>\n\u003Ctd>包含头文件引用等原则\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Linux Kernel Coding Style\u003C\u002Ftd>\n\u003Ctd>Linux 内核\u003C\u002Ftd>\n\u003Ctd>C 语言编码规范\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>细节各异，但核心都是两个字：\u003Cstrong>一致\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3 id=\"基本格式规范\">\u003Ca class=\"anchor\" href=\"#基本格式规范\" aria-label=\"跳转到标题：基本格式规范\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>基本格式规范\u003C\u002Fh3>\u003Cul>\n\u003Cli>\u003Cstrong>命名统一\u003C\u002Fstrong>：如驼峰式 nMakeAlphaCheck 或 下划线分隔式 with_underscore，选一种全项目贯彻；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>行长度 ≤ 80 字符\u003C\u002Fstrong>：太长得左右滚动，眼睛受罪；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>缩进统一\u003C\u002Fstrong>：推荐 4 个空格（Tab 也行，关键是一致）；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>花括号位置统一\u003C\u002Fstrong>：同行或另起一行，选定就别变。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"自动化格式化-clang-format\">\u003Ca class=\"anchor\" href=\"#自动化格式化-clang-format\" aria-label=\"跳转到标题：自动化格式化：clang-format\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>自动化格式化：clang-format\u003C\u002Fh3>\u003Cp>手动调格式太累？用工具！有了自动格式化工具，写代码时可以先专注逻辑，最后一键整理格式，效率拉满：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>clang-format\u003C\u002Fstrong>：LLVM 出品，在项目根目录放 \u003Ccode>.clang-format\u003C\u002Fcode> 配置文件，一键格式化；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>VS Code\u003C\u002Fstrong>：快捷键 \u003Ccode>Shift+Alt+F\u003C\u002Fcode>，或者命令面板搜 \u003Ccode>Format Document\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"const-修饰符-告诉编译器-quot-这个别动-quot\">\u003Ca class=\"anchor\" href=\"#const-修饰符-告诉编译器-quot-这个别动-quot\" aria-label=\"跳转到标题：const 修饰符：告诉编译器&amp;quot;这个别动&amp;quot;\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>const 修饰符：\u003Cbr>告诉编译器&quot;这个别动&quot;\u003C\u002Fh2>\u003Ch3 id=\"const-是什么\">\u003Ca class=\"anchor\" href=\"#const-是什么\" aria-label=\"跳转到标题：const 是什么？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>const 是什么？\u003C\u002Fh3>\u003Cp>\u003Ccode>const\u003C\u002Fcode> = constant（常量\u002F不变的）。加在参数前，就是告诉编译器：这个参数我只读不改，你帮我盯着，谁改就报错。\u003C\u002Fp>\n\u003Ch3 id=\"什么时候加-什么时候不加\">\u003Ca class=\"anchor\" href=\"#什么时候加-什么时候不加\" aria-label=\"跳转到标题：什么时候加？什么时候不加？\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>什么时候加？什么时候不加？\u003C\u002Fh3>\u003Cp>\u003Ccode>input\u003C\u002Fcode>不加：要修改参数（写入用户输入）。\u003Cbr>\u003Ccode>calculate\u003C\u002Fcode>加：只读取参数做计算，不应修改。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>除非必须修改，否则尽量用 \u003Ccode>const\u003C\u002Fcode>。\u003Cbr>代码意图更清晰，bug 更容易被发现。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"数组-装下不止两个数\">\u003Ca class=\"anchor\" href=\"#数组-装下不止两个数\" aria-label=\"跳转到标题：数组：装下不止两个数\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>数组：装下不止两个数\u003C\u002Fh2>\u003Cp>目前的计算器只能处理两个数。要是想算 1+2+3+4+5 呢？总不能无限加参数 x, y, z, a, b, c... 吧？\u003C\u002Fp>\n\u003Ch4 id=\"数组-array-来了\">\u003Ca class=\"anchor\" href=\"#数组-array-来了\" aria-label=\"跳转到标题：数组（Array）来了！\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>数组（Array）来了！\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-cpp\">double numbers[2];  \u002F\u002F 存2个double类型的数据\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"关键知识点\">\u003Ca class=\"anchor\" href=\"#关键知识点\" aria-label=\"跳转到标题：关键知识点\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>关键知识点\u003C\u002Fh4>\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>要点\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>索引从 0 开始\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>numbers[0]\u003C\u002Fcode>是第一个，\u003Ccode>numbers[1] \u003C\u002Fcode>是第二个（不是 1！）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>数组名 = 指针\u003C\u002Ftd>\n\u003Ctd>数组名本质上指向内存首地址，\u003Ccode>numbers[i]\u003C\u002Fcode> = 首地址 + i × 元素大小\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>传参时大小可省略\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>double numbers[]\u003C\u002Fcode> 或 \u003Ccode>double* numbers\u003C\u002Fcode> 都行\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cblockquote>\n\u003Cp>💡 \u003Cstrong>编程习惯：最小化替代原则。\u003C\u002Fstrong> 修改代码时，先用最小改动让程序能跑，再逐步扩展。别一次性改太多，否则出了 bug 都不知道是哪里的问题。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"循环遍历数组-while-vs-for\">\u003Ca class=\"anchor\" href=\"#循环遍历数组-while-vs-for\" aria-label=\"跳转到标题：循环遍历数组：while vs for\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>循环遍历数组：while vs for\u003C\u002Fh2>\u003Ch3 id=\"while-循环遍历\">\u003Ca class=\"anchor\" href=\"#while-循环遍历\" aria-label=\"跳转到标题：while 循环遍历\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>\u003Ccode>while\u003C\u002Fcode> 循环遍历\u003C\u002Fh3>\u003Cp>用 \u003Ccode>while\u003C\u002Fcode> 循环配合索引变量，可以逐个访问数组中的所有元素。定义一个整数变量 \u003Ccode>i\u003C\u002Fcode> 作为索引，初始值为 0，每次循环后递增，直到 \u003Ccode>i\u003C\u002Fcode> 达到数组长度为止。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>⚠️ 漏了\u003Ccode>i++\u003C\u002Fcode> = 无限循环 = 程序假死，跟 \u003Ccode>while(true)\u003C\u002Fcode> 一个效果。所以\u003Cstrong>循环体里一定要有索引递增的语句\u003C\u002Fstrong>，否则 i 值永远不变，循环条件永远为真。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3 id=\"for-循环-更优雅的选择\">\u003Ca class=\"anchor\" href=\"#for-循环-更优雅的选择\" aria-label=\"跳转到标题：for 循环：更优雅的选择\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>\u003Ccode>for\u003C\u002Fcode> 循环：更优雅的选择\u003C\u002Fh3>\u003Cp>for循环的优势：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>“初始化、条件判断、递增”三合一，结构紧凑；\u003C\u002Fli>\n\u003Cli>循环变量 \u003Ccode>i\u003C\u002Fcode> 只在循环内部可见，循环结束后自动销毁，避免误用；\u003C\u002Fli>\n\u003Cli>让变量的作用域更小，代码的模块化程度更高，也更不容易出 bug。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"函数返回值-让函数-quot-交出答案-quot\">\u003Ca class=\"anchor\" href=\"#函数返回值-让函数-quot-交出答案-quot\" aria-label=\"跳转到标题：函数返回值：让函数&amp;quot;交出答案&amp;quot;\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>函数返回值：让函数&quot;交出答案&quot;\u003C\u002Fh2>\u003Ch3 id=\"返回值的概念\">\u003Ca class=\"anchor\" href=\"#返回值的概念\" aria-label=\"跳转到标题：返回值的概念\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>返回值的概念\u003C\u002Fh3>\u003Cp>之前的函数都用\u003Ccode>void\u003C\u002Fcode>，表示不返回任何东西。但函数完全可以把计算结果返回给调用者。\u003C\u002Fp>\n\u003Cp>\u003Ccode>main\u003C\u002Fcode> 函数末尾的 \u003Ccode>return 0 \u003C\u002Fcode>也是返回值——0 表示正常结束，非 0 表示异常终止。\u003C\u002Fp>\n\u003Ch3 id=\"求和函数\">\u003Ca class=\"anchor\" href=\"#求和函数\" aria-label=\"跳转到标题：求和函数\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>求和函数\u003C\u002Fh3>\u003Cp>定义一个 \u003Ccode>sum\u003C\u002Fcode> 函数，返回类型为 \u003Ccode>double\u003C\u002Fcode>，接受数组和长度作为参数。函数内部遍历数组累加所有元素，最终返回求和结果。\u003Cbr>这样，\u003Ccode>calculate\u003C\u002Fcode> 函数就不用自己遍历累加了，直接调用 \u003Ccode>sum\u003C\u002Fcode> 拿结果，代码更简洁。\u003C\u002Fp>\n\u003Ch2 id=\"结构体-把相关数据打包在一起\">\u003Ca class=\"anchor\" href=\"#结构体-把相关数据打包在一起\" aria-label=\"跳转到标题：结构体：把相关数据打包在一起\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>结构体：把相关数据打包在一起\u003C\u002Fh2>\u003Cp>当需要传递的参数越来越多——数组首地址、数组长度、操作符类型……一个个传太麻烦了。\u003Cstrong>结构体\u003C\u002Fstrong>（Struct） 就是把多个相关数据组合成一个新类型。\u003C\u002Fp>\n\u003Cp>用结构体的好处：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>逻辑清晰\u003C\u002Fstrong>：相关数据放一起，一看就懂；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>调用简洁\u003C\u002Fstrong>：传一个结构体，而不是一堆零散参数；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>可读性强\u003C\u002Fstrong>：\u003Ccode>nums.data\u003C\u002Fcode>、\u003Ccode>nums.size\u003C\u002Fcode>，一目了然。（访问成员用\u003Cstrong>点运算符\u003C\u002Fstrong>“.”）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"变长输入-用户想输几个数就几个数\">\u003Ca class=\"anchor\" href=\"#变长输入-用户想输几个数就几个数\" aria-label=\"跳转到标题：变长输入：用户想输几个数就几个数\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>变长输入：用户想输几个数就几个数\u003C\u002Fh2>\u003Ch3 id=\"需求分析\">\u003Ca class=\"anchor\" href=\"#需求分析\" aria-label=\"跳转到标题：需求分析\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>需求分析\u003C\u002Fh3>\u003Cp>用户输入 1+2+3 回车，程序自动解析出所有数字并求和。数字个数不固定，运行时才决定。\u003C\u002Fp>\n\u003Ch3 id=\"实现方案\">\u003Ca class=\"anchor\" href=\"#实现方案\" aria-label=\"跳转到标题：实现方案\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>实现方案\u003C\u002Fh3>\u003Cp>①\u003Cstrong>读整行\u003C\u002Fstrong>：使用 \u003Ccode>getline\u003C\u002Fcode> 函数，把用户输入的整行读进字符串；\u003Cbr>②\u003Cstrong>字符串转流\u003C\u002Fstrong>：使用 \u003Ccode>stringstream\u003C\u002Fcode> 把字符串变成类似 \u003Ccode>cin\u003C\u002Fcode> 的流对象；\u003Cbr>③\u003Cstrong>循环提取\u003C\u002Fstrong>：使用循环配合流提取依次读取每个数字，直到流为空。\u003C\u002Fp>\n\u003Ch3 id=\"注意事项\">\u003Ca class=\"anchor\" href=\"#注意事项\" aria-label=\"跳转到标题：注意事项：\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>注意事项：\u003C\u002Fh3>\u003Cul>\n\u003Cli>头文件建议\u003Cstrong>显式引入\u003C\u002Fstrong>所有需要的，别依赖隐式包含，跨平台兼容性更好；\u003C\u002Fli>\n\u003Cli>\u003Ccode>getline\u003C\u002Fcode> 读完后，原来的 \u003Ccode>cin\u003C\u002Fcode> 已经被消耗了，必须用 \u003Ccode>stringstream\u003C\u002Fcode> 重新处理；\u003C\u002Fli>\n\u003Cli>循环提取时，以空格或回车作为分隔符。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"课后-q-amp-a\">\u003Ca class=\"anchor\" href=\"#课后-q-amp-a\" aria-label=\"跳转到标题：课后 Q&amp;amp;A\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>课后 Q&amp;A\u003C\u002Fh2>\u003Cp>\u003Cstrong>Q1：能获取流在原始字符串中的位置吗？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>流式输入不关心位置。如果需要追踪，建议直接处理字符串——用循环逐个字符遍历，遇到空格截断，再用 \u003Ccode>stoi\u003C\u002Fcode>（字符串转整数）或 \u003Ccode>stod\u003C\u002Fcode>（字符串转浮点数）转换。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>Q2：转码学 C++ 有什么建议？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>作为曾经的 EE 转 CS 选手，分享一下自己的经验：\u003Cbr>📖 \u003Cstrong>入门书推荐\u003C\u002Fstrong> 《C++ Primer》，内容全面，适合新手。\u003Cbr>🎯 \u003Cstrong>学习方法\u003C\u002Fstrong>：不要试图一次性学完所有知识点。先学基础 → 立刻动手实践 → 觉得够用了就找个感兴趣的方向开干。\u003Cbr>\u003Cstrong>编程能力主要靠练，看再多书不如写一行代码。\u003C\u002Fstrong> 项目中学到的东西，印象最深，也最实用。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",[127,130,133,136,139,142,145,148,151,154,157,159,161,164,167,170,173,176,180,182,185,188,191,194,196,198,201,204,206,208,211],{"id":128,"text":129,"level":109},"上节课回顾-我们做到了哪一步","上节课回顾：我们做到了哪一步？",{"id":131,"text":132,"level":109},"函数模块化-别把所有代码放在-main-里","函数模块化：别把所有代码放在 main 里",{"id":134,"text":135,"level":9},"为什么要拆函数","为什么要拆函数？",{"id":137,"text":138,"level":9},"怎么拆","怎么拆？",{"id":140,"text":141,"level":9},"参数传递-函数之间怎么-quot-传话-quot","参数传递：函数之间怎么&quot;传话&quot;？",{"id":143,"text":144,"level":109},"git-版本管理-程序员的-quot-时光机-quot","Git 版本管理：程序员的&quot;时光机&quot;",{"id":146,"text":147,"level":9},"版本管理是什么","版本管理是什么？",{"id":149,"text":150,"level":9},"从零搭建-四步走","从零搭建：四步走",{"id":152,"text":153,"level":109},"代码风格-能跑不等于能看","代码风格：能跑不等于能看",{"id":155,"text":156,"level":9},"代码可读性有多重要","代码可读性有多重要？",{"id":158,"text":158,"level":9},"常见风格指南",{"id":160,"text":160,"level":9},"基本格式规范",{"id":162,"text":163,"level":9},"自动化格式化-clang-format","自动化格式化：clang-format",{"id":165,"text":166,"level":109},"const-修饰符-告诉编译器-quot-这个别动-quot","const 修饰符：告诉编译器&quot;这个别动&quot;",{"id":168,"text":169,"level":9},"const-是什么","const 是什么？",{"id":171,"text":172,"level":9},"什么时候加-什么时候不加","什么时候加？什么时候不加？",{"id":174,"text":175,"level":109},"数组-装下不止两个数","数组：装下不止两个数",{"id":177,"text":178,"level":179},"数组-array-来了","数组（Array）来了！",4,{"id":181,"text":181,"level":179},"关键知识点",{"id":183,"text":184,"level":109},"循环遍历数组-while-vs-for","循环遍历数组：while vs for",{"id":186,"text":187,"level":9},"while-循环遍历","while 循环遍历",{"id":189,"text":190,"level":9},"for-循环-更优雅的选择","for 循环：更优雅的选择",{"id":192,"text":193,"level":109},"函数返回值-让函数-quot-交出答案-quot","函数返回值：让函数&quot;交出答案&quot;",{"id":195,"text":195,"level":9},"返回值的概念",{"id":197,"text":197,"level":9},"求和函数",{"id":199,"text":200,"level":109},"结构体-把相关数据打包在一起","结构体：把相关数据打包在一起",{"id":202,"text":203,"level":109},"变长输入-用户想输几个数就几个数","变长输入：用户想输几个数就几个数",{"id":205,"text":205,"level":9},"需求分析",{"id":207,"text":207,"level":9},"实现方案",{"id":209,"text":210,"level":9},"注意事项","注意事项：",{"id":212,"text":213,"level":109},"课后-q-amp-a","课后 Q&amp;A"]