4.3.2 应该在什么时候使用goto?

GreyZeng 2021-08-07 15:23:11

原文地址
教材4.3.2中写到

函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。

作者认为只要有助于逻辑清晰表达,使可以使用goto的。犹记得大一时接触c语言时,老师特地说过不要使用goto,goto虽然好用,但会使程序结构混乱。

于是抱着疑惑查阅了相关资料,发现主要有两种观点。一种就是不提倡使用goto,因为容易把逻辑弄乱且难以理解;另一种提倡使用goto,因为在跳出多层循环和异常处理时比较方便且效率高,很多大型项目、开源项目,包括linux都会巨量的出现goto来处理错误。所以比较好的标准就是在错误处理的时候使用goto,其他地方都禁止使用goto吗?

...全文
426 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
GreyZeng 2022-03-14
  • 打赏
  • 举报
回复

经过了一个大三下学期,我的代码总行数增长了近9000行,其中包括在软件工程课程中使用的Javascript,WXSS,WXML,C++以及其他课程使用的Python,Matlab。在这些代码中,跳转语句非常多,其中有的地方需要连接到一个语句块之外,但是所连接到的地方又无需使用多次,这个时候,如果用到goto语句,就可以极大的减少代码行数,并且使函数简单化。

​ 而且我发现,《构建之法》这本书中提到的“函数最好有单一出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto”,这一观点非常正确,一个函数最好只有一个出口,这样在逻辑上会非常清晰,并且,在Debug的时候,如果只有一个出口的话,单步调试中进出函数的过程都会非常明晰,编写程序的时候也不会错在某个出口的返回值出了问题。因此我认为,只要是符合代码规范,并且有助于代码的清晰展示,任何语句都可以使用,良好的goto语句比臃肿的if判断反而更利于阅读。

原文地址

GreyZeng 2022-03-14
  • 打赏
  • 举报
回复

目前我认为软件开发的过程中只要能够使代码实现清晰简洁,像goto这样的方法也可以考虑使用。但一般而言goto只适用于某些特殊的场景,例如所有代码分支都有统一出口或多重循环的情况。无论如何,写出让他人可以看懂的代码是最重要的。
原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

这里我仍然坚持学期初的观点,即:

  • 只有在需要错误处理而语言本身没有提供错误处理功能的情况下使用goto语句
    同时多加入两点前提:

  • 优先考虑更换开发语言

  • 同时应当在项目的README,相关函数的开头加以说明,且确保成员们受到过相关的培训

团队的一切规范都是服务于开发效率的,但是规范对于开发效率和可维护性确实有很大影响,一种不常见的规范本来就是对开发人员的一种心智负担,因此如果没有特殊需要,不要使用这样的构造。

关于开发语言,相信不少人会对此抱有疑问,但是语言本身确实有其专长,如果进行Web开发,那么去使用没有错误处理的C显然是不明智的。事实上,语言本身是根据需要构建的,如果你发现一门语言没有你需要的功能以至于你需要绕很多弯去实现,很可能你的使用方式是错误的,或者这门语言不适合解决你现在遇到的问题。不得不提一提我们项目的React(x

原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

对于这个问题,我也询问了周围同学的看法,大家的观点大都也与我在提出疑问时的观点一致,goto语句可类比于汇编程序中的跳转指令,它容易造成包含分支和循环结构的程序逻辑混乱,往往会给阅读程序代码的工作人员带来更为复杂的任务难度,因而往往不建议在程序中使用goto语句。
原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

在本学期的软工课程中并没有使用到goto,不过经过团队项目的实践,还是很认同助教的观点“在团队项目中尽量约束”。对于大佬而言,goto可以简化逻辑,但在团队合作中,如果需要阅读含有goto的代码,那会变得非常头痛。
原文地址

个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下 目录 1. 入门 1 1.1. Hello world 1 1.2. 命令行参数 2 2. 程序结构 3 2.1. 类型 4 2.1.1. 命名类型(named type)与未命名类型(unamed type) 4 2.1.2. 基础类型(underlying type) 4 2.1.3. 可赋值性 5 2.1.4. 类型方法集 6 2.1.5. 类型声明 6 2.2. 变量 8 2.2.1. 变量声明 8 2.2.2. 类型零值 12 2.2.3. 指针 13 2.3. 赋值 17 2.4. 包和文件 17 2.5. 作用域 18 2.6. 语句 19 2.7. 比较运算符 20 2.8. 类型转换 21 2.9. 控制流 23 2.9.1. If 23 2.9.2. Goto 24 2.9.3. For 25 2.9.4. Switch 25 2.9.5. break语句 31 2.9.6. Continue语句 31 3. 基础数据类型 31 3.1. golang类型 31 3.2. Numeric types 32 3.3. 字符串 33 3.3.1. 什么是字符串 33 3.3.2. 字符串底层概念 35 3.3.3. 获取每个字节 38 3.3.4. Rune 39 3.3.5. 字符串的 for range 循环 40 3.3.6. 用字节切片构造字符串 41 3.3.7. 用rune切片构造字符串 42 3.3.8. 字符串的长度 42 3.3.9. 字符串是不可变的 42 3.3.10. UTF8(go圣经) 43 3.4. 常量 45 3.4.1. 常量定义 45 3.4.2. 常量类型 46 3.4.3. Iota 46 4. 组合数据类型 47 4.1. 数组 47 4.1.1. 数组概述 47 4.1.2. 数组的声明 49 4.1.3. 数组的长度 50 4.1.4. 遍历数组 50 4.1.5. 多维数组 51 4.2. 切片 52 4.2.1. 什么是切片 52 4.2.2. 切片概述 55 4.2.3. 创建一个切片 55 4.2.4. 切片遍历 57 4.2.5. 切片的修改 58 4.2.6. 切片的长度和容量 60 4.2.7. 追加切片元素 62 4.2.8. 切片的函数传递 65 4.2.9. 多维切片 66 4.2.10. 内存优化 67 4.2.11. nil slice和empty slice 69 4.2.12. For range 70 4.3. 结构 71 4.3.1. 什么是结构体? 71 4.3.2. 结构体声明 73 4.3.3. 结构体初始化 77 4.3.4. 嵌套结构体(Nested Structs) 81 4.3.5. 匿名字段 82 4.3.6. 导出结构体和字段 84 4.3.7. 结构体相等性(Structs Equality) 85 4.4. 指针类型 86 4.5. 函数 87 4.6. map 87 4.6.1. 什么是map 87 4.6.2. 声明、初始化和make 89 4.6.3. 给 map 添加元素 91 4.6.4. 获取 map 中的元素 91 4.6.5. 删除 map 中的元素 92 4.6.6. 获取 map 的长度 92 4.6.7. Map 的相等性 92 4.6.8. map的排序 92 4.7. 接口 93 4.7.1. 什么是接口? 93 4.7.2. 接口的声明与实现 96 4.7.3. 接口的实际用途 97 4.7.4. 接口的内部表示 99 4.7.5. 空接口 102 4.7.6. 类型断言 105 4.7.7. 类型选择(Type Switch) 109 4.7.8. 实现接口:指针接受者与值接受者 112 4.7.9. 实现多个接口 114 4.7.10. 接口的嵌套 116 4.7.11. 接口的零值 119 4.8. Channel 120 4.9. 类型转换 120 5. 函数 120 5.1. 函数的声明 121 5.2. 一个递归函数的例子( recursive functions) 121 5.3. 多返回值 121 5.4. 命名返回值 121 5.5. 可变函数参数 122 5.6. Defer 123 5.6.1. Defer语句介绍 123 5.6.2. Defer使用场景 128 5.7. 什么是头等(第一类)函数? 130 5.8. 匿名函数 130 5.9. 用户自定义的函数类型 132 5.10. 高阶函数(装饰器?) 133 5.10.1. 把函数作为参数,传递给其它函数 134 5.10.2. 在其它函数中返回函数 134 5.11. 闭包 135 5.12. 头等函数的实际用途 137 6. 微服务创建 140 6.1. 使用net/http创建简单的web server 140 6.2. 读写JSON 144 6.2.1. Marshal go结构到JSON 144 6.2.2. Unmarshalling JSON 到Go结构 146 7. 方法 146 7.1. 什么是方法? 146 7.2. 方法示例 146 7.3. 函数和方法区别 148 7.4. 指针接收器与值接收器 153 7.5. 那么什么时候使用指针接收器,什么时候使用值接收器? 155 7.6. 匿名字段的方法 156 7.7. 在方法中使用值接收器 与 在函数中使用值参数 157 7.8. 在方法中使用指针接收器 与 在函数中使用指针参数 159 7.9. 在非结构体上的方法 161 8. 并发入门 162 8.1. 并发是什么? 162 8.2. 并行是什么? 162 8.3. 从技术上看并发和并行 163 8.4. Go 对并发的支持 164 9. Go 协程 164 9.1. Go 协程是什么? 164 9.2. Go 协程相比于线程的优势 164 9.3. 如何启动一个 Go 协程? 165 9.4. 启动多个 Go 协程 167 10. 信道channel 169 10.1. 什么是信道? 169 10.2. 信道的声明 169 10.3. 通过信道进行发送和接收 169 10.4. 发送与接收默认是阻塞的 170 10.5. 信道的代码示例 170 10.6. 信道的另一个示例 173 10.7. 死锁 174 10.8. 单向信道 175 10.9. 关闭信道和使用 for range 遍历信道 176 11. 缓冲信道和工作池(Buffered Channels and Worker Pools) 179 11.1. 什么是缓冲信道? 179 11.2. 死锁 182 11.3. 长度 vs 容量 183 11.4. WaitGroup 184 11.5. 工作池的实现 186 12. Select 188 12.1. 什么是 select? 188 12.2. 示例 189 12.3. select 的应用 190 12.4. 默认情况 190 12.5. 死锁与默认情况 191 12.6. 随机选取 191 12.7. 这下我懂了:空 select 191 13. 文件读写 191 13.1. GoLang几种读文件方式的比较 197 14. 个人 197 14.1. ++,-- 198 14.2. 逗号 198 14.3. 未使用的变量 199 14.4. Effective go 199 14.4.1. 指针 vs. 值 199 14.5. 可寻址性-map和slice的区别 201 14.5.1. slice 201 14.5.2. map 202 14.6. golang库 203 14.6.1. unicode/utf8包 203 14.6.2. time包 205 14.6.3. Strings包 205 14.6.4. 输入输出 212 14.6.5. 正则处理 224 14.6.6. Golang内建函数 226
详细解释了uboot的start.s中的每行代码; 添加了相关知识点的详细解释,包括: 4.1. 如何查看C或汇编的源代码所对应的真正的汇编代码 67 4.2. uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式 69 4.3. 什么是watchdog + 为何在要系统初始化的时候关闭watchdog 70 4.3.1. 什么是watchdog 71 4.3.2. 为何在要系统初始化的时候关闭watchdog 71 4.4. 为何ARM7中PC=PC+8 71 4.4.1. 为何ARM9和ARM7一样,也是PC=PC+8 73 4.5. AMR寄存器的别名 + APCS 79 4.5.1. ARM中的寄存器的别名 79 4.5.2. 什么是APCS 81 4.6. 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈 81 4.6.1. 保存现场/上下文 82 4.6.1.1. 什么叫做上下文context 82 4.6.2. 传递参数 82 4.6.3. 举例分析C语言函数调用是如何使用堆栈的 83 4.7. 关于为何不直接用mov指令,而非要用adr伪指令 84 4.8. mov指令的操作数的取值范围到底是多少 85 4.9. 汇编学习总结记录 89 4.9.1. 汇编中的标号=C中的标号 89 4.9.2. 汇编中的跳转指令=C中的goto 89 4.9.3. 汇编中的.globl=C语言中的extern 90 4.9.4. 汇编中用bl指令和mov pc,lr来实现子函数调用和返回 90 4.9.5. 汇编中的对应位置有存储值的标号 = C语言中的指针变量 91 4.9.6. 汇编中的ldr+标号,来实现C中的函数调用 93 4.9.7. 汇编中设置某个寄存器的值或给某个地址赋值 94
本书是讲述Visual Basic编程标准的一本专著。全书分5个部分,共14章。分别讲述使用Visual Basic编程时总体设计、代码结构设计、用户界面设计和小组软件开发应遵循的标准。全书配有大量应用实例,便于读者学以致用。本书适用于Visual Basic 编程人员,对于使用其他语言的编程人员,也有很高的参考价值。 目 录 译者序 前言 第一部分 设 计 第1章 创建对象和工程模板 1 1.1 使用对象模板 1 1.2 使用项目模板 2 1.2.1 Visual Basic项目模板概述 2 1.2.2 创建自定义项目模板 4 1.3 自定义模板的行为特性 4 1.3.1 激活模板和取消模板的激活状态 4 1.3.2 设置模板文件夹 5 1.4 编程原则 5 1.4.1 不要将对象模板中的特定应用程序 的值或特定组件的值进行硬编码 5 1.4.2 在对象模板中提供内容广泛的注 释,尤其是在需要进行修改的地方 要加上注释 7 第2章 设计模块和过程 9 2.1 创建具有很强内聚力的模块 9 2.2 创建松散连接和高度专用的过程 10 2.2.1 使所有过程都执行专门的任务 10 2.2.2 尽量使过程成为自成一体的独立 过程 11 2.2.3 尽量减少扇入和扇出 12 2.2.4 设法按字母顺序对模块中的过程 进行排序 12 2.3 编程原则 13 2.3.1 为过程和模块赋予表义性强的名字 13 2.3.2 为每个过程赋予单个退出点 15 2.3.3 为每个过程赋予明确定义的作用域 18 2.3.4 用参数在过程之间传递数据 18 2.3.5 使用统一和直观明了的方式来调 用过程 21 第二部分 编程中使用的约定 第3章 命名约定 23 3.1 数据类型后缀 23 3.2 匈牙利标记法 23 3.2.1 表示变量数据类型的前缀 24 3.2.2 表示变量的作用域的前缀 25 3.2.3 其他前缀 26 第4章 使用常量和枚举值 28 4.1 使用常量 28 4.1.1 幻数很容易在数据输入时出错 28 4.1.2 幻数很难更新 28 4.1.3 常量使代码更容易阅读 29 4.2 使用枚举值 29 4.2.1 创建自定义的枚举值 30 4.2.2 使用自定义枚举值 30 4.3 编程原则 31 4.3.1 给所有常量加上前缀c_和作用域 指示符 31 4.3.2 无论什么作用域,均用常量取代 幻数 33 4.3.3 只要可能,均应使用枚举 33 4.3.4 引用控件数组的元素时请使用常 量 34 4.3.5 将应用程序前缀或公司特定的前 缀用于枚举成员 35 4.3.6 当枚举值不能使用时,使用常量 36 4.3.7 当参数接受有限数量的值时,请 使用枚举 38 4.3.8 验证作为枚举类型传递的值 38 第5章 变量 41 5.1 编程原则 41 5.1.1 定义有焦点的变量 41 5.1.2 为变量赋予表义性强的名字 43 5.1.3 在变量名中混合使用大小写字母 46 5.1.4 只对常用变量名和长变量名进行 缩写 46 5.1.5 使用统一的量词 47 5.1.6 使用肯定形式的布尔变量 47 5.1.7 显式说明变量 49 5.1.8 用精心选择的数据类型说明变量 51 5.1.9 只有在绝对必要时才使用Variant 数据类型 54 5.1.10 尽量缩小变量的作用域 56 5.1.11 使用“和”字符对字符串进行 并置操作 58 第6章 对错误的处理 60 6.1 Visual Basic的编译选项 60 6.2 Err对象 61 6.3 错误处理程序的类型 62 6.3.1 使用On Resume Next以忽略错误 62 6.3.2 使用On Error GoTo转移执行的代 码流 64 6.3.3 错误处理程序与调用栈 68 6.3.4 使用On Error GoTo 0,在运行时 取消错误处理程序的激活状态 69 6.3.5 用调试方式激活错误处理程序和 取消其激活状态 70 6.4 中央错误处理程序 71 6.5 编程原则 76 6.5.1 使用On Error GoTo语句捕获意 料之外的错误 76 6.5.2 使用On Error Resume Next语句 捕获预料之中的错误 77 6.5.3 创建统一的错误处理程序块 79 第三部分 代码结构 第7章 代码的格式化 83 7.1 编程原则 86 7.1.1 不要将多个语句放在同一行上 86 7.1.2 使用行接续符 87 7.1.3 缩进后续行 90 7.1.4 运用语句缩进来显示代码的组织 结构 92 7.1.5 对模块的Declarations部分中的代 码进行缩进,显示其从属关系 98 7.1.6 使用白空间将相关语句组合在一 起 99 第8章 代码的注释 106 8.1 编程原则 106 8.1.1 用文字说明代码的作用 106 8.1.2 如果你想违背好的编程原则,请 说明为什么 107 8.1.3 用注释来说明何时可能出错和为 什么出错 108 8.1.4 在编写代码前进行注释 109 8.1.5 纯色字符注释行只用于主要注释 110 8.1.6 避免形成注释框 112 8.1.7 使用撇号来指明注释 112 8.1.8 增强注释的可读性 114 8.1.9 对注释进行缩进,使之与后随的 语句对齐 115 8.1.10 为每个过程赋予一个注释标头 115 8.1.11 使用内部注释来说明代码进程 118 8.1.12 用行尾注释来说明变量 122 第9章 循环结构 123 9.1 编码指导原则 123 9.1.1 使用For...Next,使代码循环运行 规定的次数 123 9.1.2 使用Do...loop,使循环按照未定 次数来运行 130 9.1.3 用Do...Loop取代While...Wend 135 9.1.4 使用For Each...Next,循环运行 一个集合的所有成员 135 第10章 控制代码流 140 10.1 编程原则 140 10.1.1 当根据一个条件是True还是False 来作出判断时,使用If...Then...Else 140 10.1.2 对非布尔表达式与各种可能的 值进行比较时,使用Select Case 语句 143 10.1.3 用行尾注释使嵌套式判断结构 更加清楚 147 10.1.4 对表达式进行格式化,以便进行 准确的计算和代码的理解 148 10.1.5 尽可能不要使用GoSub 149 10.1.6 只有当没有其他替代方法或者 当转移到一个错误处理程序或单 个退出点时,才使用GoTo语句 150 第四部分 用户界面的操作 第11章 用户界面的设计 153 11.1 界面设计必须保持一致 153 11.2 编程原则 154 11.2.1 为窗体赋予统一的外观和行为 特性 154 11.2.2 使控件具备标准外观 162 11.2.3 在规定情况下使用最佳界面组 件 167 11.2.4 提供便于理解和使用的菜单 171 11.2.5 尽可能使用系统颜色 177 第12章 用户的输入和通知消息 179 12.1 用户的输入 179 12.2 通知消息 180 12.3 编程原则 180 12.3.1 确保完善的键盘导航和交互操 作特性 180 12.3.2 提供统一和直观的鼠标交互操 作特性 185 12.3.3 创建有创意和功能良好的消息框 193 第五部分 小组操作的项目 第13章 版本控制 199 13.1 编程原则 199 13.1.1 每次对程序编译后应将版本号 递增1 199 13.1.2 在About对话框中显示程序的版 本号 200 13.1.3 保持ActiveX组件中的向后兼容 性 201 13.1.4 在Readme文件中记下所做的修 改 205 13.1.5 对文件做好备份 206 13.1.6 使用Microsoft Visual SourceSafe 来维护源代码的版本 206 第14章 源代码控制 207 14.1 小组软件开发必须解决的问题 207 14.2 了解Visual SourceSafe 208 14.3 安装Visual SourceSafe 208 14.3.1 创建Visual SourceSafe数据库 209 14.3.2 打开Visual SourceSafe数据库 210 14.3.3 将用户添加给Visual SourceSafe 数据库 211 14.3.4 将Visual Basic工程置于Source- Safe控件下 211 14.4 Visual Basic项目与Visual SourceSafe 213 14.4.1 指定工作文件夹 214 14.4.2 创建项目的工作拷贝 215 14.4.3 使用Visual SourceSafe Explorer 借出文件 216 14.4.4 通过Visual Basic IDE借出和归 还文件 218 14.4.5 将新文件添加给源代码控制下 的项目 219 14.4.6 获取文件的最新版本 219 14.4.7 对不同版本进行比较 221.
第1篇 Linux下C语言基础 第1章 Linux简介 1.1 GNU简介 1.2 Linux简介 1.2.1 Linux发展史 1.2.2 Linux发行版 1.2.3 Linux内核版本 1.2.4 Linux与UNIX的关系 1.2.5 Linux在服务器方面的发展 1.2.6 Linux在嵌入式系统方面的发展 1.2.7 Linux在桌面系统方面的发展 1.3 Linux环境下的其他编程语言 1.3.1 C++ 1.3.2 Java 1.3.3 Perl 1.3.4 Python 1.3.5 Ruby 1.3.6 PHP 第2章 控制结构 2.1 goto语句 2.1.1 C语言中的无条件跳转 2.1.2 使用goto语句进行出错处理 2.1.3 出错处理的一般模型 2.2 C语言中的分支结构 2.2.1 分支结构的翻译 2.2.2 使用goto语句实现分支结构 2.3 短路计算 2.3.1 短路计算 2.3.2 &&运算的短路计算 2.3.3 ||运算的短路计算 2.4 C语言中的循环结构 2.4.1 while循环 2.4.2 do…while循环 2.4.3 for循环 2.5 switch语句 2.5.1 switch语句的应用 2.5.2 使用goto语句实现switch语句 2.6 优化控制结构 2.6.1 表达式优化——使用替换程序中的乘除法 2.6.2  表达式优化——常量折叠 2.6.3 表达式优化——使用数学公式 2.6.4 表达式优化——存储问题 2.6.5 分支优化——改变判断顺序 2.6.6 分支优化——使用switch语句 2.6.7 循环优化——一次性计算 第3章 C语言中的函数 3.1 函数的本质 3.2 变量的作用域和生命期 3.2.1 全局变量 3.2.2 局部变量 3.3 变量的初始值 3.3.1 全局变量的初始值 3.3.2 局部变量的初始值 3.4 与函数有关的优化 3.4.1 函数调用与程序优化 3.4.2 变量存储优化 3.5 编写多文件程序——变量的存储类别 3.5.1 存储类别 3.5.2 static变量的作用——改变变量的生命期 3.5.3 static变量的作用——实现封装和模块化设计 3.6 编写多文件的程序——链接的作用 3.6.1 链接多个文件 3.6.2 链接时符号解析规则 3.6.3 链接规则的应用 3.7 可变参数 3.7.1 可变参数的概念 3.7.2 实现一个简单的可变参数的函数 3.7.3 可变参数实例 3.7.4 关于printf函数的疑问——缺少整型参数 3.7.5 关于printf函数的疑问——缺少字符串地址参数 第4章 C语言中的指针与字符串 4.1 sizeof运算符 4.1.1 sizeof运算符的应用——得到内置类型的大小 4.1.2 sizeof运算符的应用——得到复合类型的大小 4.2 指针的应用 4.2.1 指针与别名陷阱 4.2.2 数组的指针 4.2.3 指针的指针 4.2.4 指针与参数传递 4.2.5 指针类型的意义 4.2.6 void*型指针 4.3 函数的指针 4.3.1 C语言中的函数指针 4.3.2 函数指针的应用——回调函数 4.3.3 函数指针数组 4.4 字符串 4.4.1 字符串与字符数组 4.4.2 字符串与指针 4.4.3 限定修饰符const 4.4.4 const关键字修饰指针——在指针定义之前 4.4.5 const关键字修饰指针——在指针定义之中 4.4.6 const关键字修饰指针——在指针定义之前和定义之中 4.4.7 使用const关键字的意义 第5章 C语言的高级技术 第2篇 C语言开发环境 第6章 vi与vim编辑器 第7章 gcc编译器 第8章 makefile 第9章 gdb 第3篇 Linux进程操作 第10章 进程环境 第11章 进程控制 第12章 时间和日历历程 第13章 信号及信号处理 第14章 进程间通信 第15章 线程 第4篇 Linux文件操作 第17章 文件I/O 第18章 文件管理 第19章 目录操作 第20章 特殊文件 第21章 基于流的I/O 第5篇 Linux网络编程 第22章 TCP和UDP协议 第23章 网络编程基础 第24章 网络编程进阶 第25章 网络编程实例——实现文件传输程序 第26章 网络编程实例——简单的Web服务器 第6篇 shell脚本知识 第27章 shell脚本基础 第28章 shell脚本中的控制结构 844

605

社区成员

发帖
与我相关
我的任务
社区描述
程序员。写过:移山之道,编程之美,构建之法,智能之门。
软件工程软件构建团队开发 企业社区 北京·朝阳区
社区管理员
  • SoftwareTeacher
  • GreyZeng
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧