搜索网站建设,做代练的网站,开发一款像淘宝的app需要多少钱,暴利产品竞价单页网站学习C 你是否会有以下几点误解#xff1f;1. “要理解C #xff0c;你必须先学习C”2. “C 是一门面向对象的语言”3. “为了软件可靠性#xff0c;你需要垃圾回收”4. “为了效率#xff0c;你必须编写底层代码”5. “C 只适用于大型、复杂的程序”如果你中*了#xff0c… 学习C 你是否会有以下几点误解1. “要理解C 你必须先学习C” 2. “C 是一门面向对象的语言” 3. “为了软件可靠性你需要垃圾回收” 4. “为了效率你必须编写底层代码” 5. “C 只适用于大型、复杂的程序” 如果你中*了说明这篇文章适合你看。对某些人某些任务在某些时间其中一些误解曾经只是正确的。然而在如今的C 应用广泛使用的最先进的ISO C 2011编译器和工具它们只是误解。 下面来一一解释 误解一“要理解C 你必须先学习C” 学习C 基础编程比学习C要容易地多。 C几乎是C 的一个子集但是它不是最先要学习的最好的子集因为C缺少计数支持类型安全和易用的标准库而C 为简单任务提供了这些。 误解二“C 是一门面向对象的语言” C 支持OOP和其他编程风格但它并不局限于狭隘的“面向对象”。它综合地支持了包括面向对象和泛型编程技术。通常一个问题的最优解决方案包含不止一种风格范例。“最优”我指的是最短、最易于理解、最有效率和最易于维护等。 “C 是一门面向对象的语言”使人们认为C 不是必要的当与C做比较时除非你需要一个巨大的类继承层次以及很多须函数运行时多态——对很多人和很多问题这样应用并不合适。相信这个误区导致C 因为不是纯面向对象而遭到谴责毕竟如果你把“好”和“面向对象”等同起来那么C 明显包含了很多不是面向对象的东西一定会被认为是“不好”。不管是哪种情形这个误解为不学习C 提供了一个很好的借口 误解三“为了软件可靠性你需要垃圾回收” 在回收不再使用的内存上垃圾回收做的很好但是并不完美。它并非灵丹妙药。因为内存可以被间接地引用并且很多资源并不是普通内存。 误解四“为了效率你必须编写底层代码” 许多人相信高效率的代码必须是底层代码。一些人甚至认为底层代码天生就是高效的“如果代码很丑陋那它一定很高效一定有人花费了大量时间和精力来优化它”。当然你仅仅使用底层代码是可以写出高效代码的并且有时在直接处理机器资源时必须使用底层代码。 然而你一定要衡量一下工作是否有价值现代C 编译器非常高效而现代机器架构非常复杂。如果必须使用底层代码一定要通过接口封装起来以便于使用。通常通过高层接口封装底层代码会带来更好的优化如避免“滥用”底层代码。在关注效率的场合首先尝试用高层抽象来呈现需要的解决方案而不要不加考虑地使用比特位和指针。 误解五“C 只适用于大型、复杂的程序” C 是一个巨型的语言。它定义的大小和C#与Java差不多。但是这并不意味着你必须知道每一个细节或者在每一个程序中都用到所有特性。 接下来再说一个C 非常经典的易犯错的案例 错误代码 12bool operator( )(const GUID _Key1, const GUID _Key2) const{ return memcmp(_Key1, _Key2, sizeof(GUID)) -1; }解释 不能将 memcpy()、strcmp() 以及其他一些标准函数的返回值和 1、-1 这些具体的数字做比较因为这些函数的返回值只保证大于 0 或者小于 0译注而并不保证大于0就等于1小于0就等于-1。 上面那段错误的代码可能在很长时间内都能正常工作。不过那仅仅是因为运气好而已没什么其他原因。某一天你写的函数很可能突然间就崩溃了 —— 比如你换了一个编译器编译源代码或者通过其他方式优化了 memcpy() 函数。然后你的代码就不能正常工作了。 正确的代码 12bool operator( )(const GUID _Key1, const GUID _Key2) const{ return memcmp(_Key1, _Key2, sizeof(GUID)) 0; } 建议 不要依赖函数本身的行为。如果文档上说一个函数能返回一个不等于 0 的值那它就是这么实现的。也就是说这个函数可能返回 -10、2 或者 1024。你可能经常看到函数的返回值就是 -1、0 或者 1但是这并不能保证它每次都会这么做。 这个错误是通过 PSV-Studio 静态分析工具扫描分析得到的。错误文本如下V698 表达式 “memcmp(…) -1“ 是不正确的。这个函数可能的返回值不一定只有“-1”而可能是任何负数。请考虑到使用 “memcmp(…) 0 ”来替换。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。