由于学习CUDA的需要,让我有了重新学习C的机会。话不多说,马上开始吧。
第一章 总体概览
一 程序
程序=数据结构+算法。如果程序是一个人,正确的数据结构就是强壮的体格,高效的算法就是高尚的性格。而语言,只是一件外衣而已。
学习方法:对学生来说,学习编程最好的方法之一就是阅读源代码。www.github.com是目前最流行、软件最丰富的网站,没有之一。
编程风格:风格无关对错,但是切忌两种情况,一是没有风格,二是总换风格。风格涉及以下几个方面:(1)变量名命名。有两种方法,驼峰法和下划线法。这里推荐下划线法。(2)缩进和大括号。推荐大括号单独成行。(3)字体。推荐等宽字体。等宽字体有Monaco、Lucida Console、Lucida Sans Typewriter、Consolas、Courier New。此外再推荐关于风格的书籍《重构》。
二 算法
算法的定义:an algorithm is a step-by-step procedure for caculations。算法很重要,它是计算机科学的核心,如果没有算法,计算机就不配再称为科学。虽然计算机语言和开发平台日新月异,但万变不离其宗的还是算法和理论。是否精通算法是菜鸟和高手的区别,也是底薪和高薪的区别。大公司面试基本上都是算法题。算法也是区分一般任务和艰巨任务的一个指标。一般任务就是指做一个网站,只会给你3千块钱,是产业链的低端;而艰巨任务就是指解决北京的交通问题,国家会给你10个亿。
推荐书籍:《算法导论》(独孤九剑级别);《The art of computer programming》(葵花宝典级别)——Donald E.Knuth;《啊哈!算法》;《算法(第4版)》——Sedgewick;《算法的乐趣》;《算法问题实战策略》;《挑战程序设计竞赛》;《算法帝国》;《迷茫的旅行商》;《可能与不可能的边界——P/NP问题趣史》;
三 内功
数学。现代数学主流是代数几何,要求精通代数、几何、分析三门。如果只精通分析,可以选择的专业有复分析、分形、微分方程。三个都不擅长,可以选择的专业是动力系统,只要求微积分。再次之,组合数学专业只用到中学数学。统计数学只用到小学数学。最low的是计算数学,用机器(计算机)进行计算。
计算机和数学的关系:数值分析、集合论、概率论与数理统计分析会直接应用于计算机学科,而且数学思维对计算机职业来说也是至关重要。
软件工程。我们不光需要数学指导我们找到解决方案,还需要另外的东西指导我们如何运用数学,选择哪个作为最佳方案。除此之外,为了系统的得到这个尽可能的最佳,我们需要引入一门课程,就是《软件工程》。它包含了商业、沟通、管理、市场、开发等等方面。一个软件产品,技术很重要,但不是全部。对于它的重要性,行内有句话说的很形象:懂得软件工程的程序员就不再是妓女了!
四 Linux
程序员一个最基本的理念就是,让机器适应人,而不是人去适应机器。Linux的所有源代码都是公开的,你可以按照你自己的去修改它,让它适应你。Linux是一段崎岖的山路,如果一路走下去,会一览众山小。只要 坚持用半年,就会发现windows和它的差距。
Linux对求职来说也是好处多多。能在Linux上编程的程序员薪水很高,能编写Linux内核以及驱动程序的更是凤毛麟角,炙手可热。
书籍:《鸟哥的Linux私房菜》。
开发工具:主流的IDE是Kdevelop;很多老手用的是“编辑器+make+GCC+GDB”的搭配。这里的编辑器分为有模式编辑器和无模式编辑器两大类。有模式编辑器最知名的是:Vim、Vi。无模式编辑器典型有:nano、Emacs。它们都是命令行编辑器,刚开始用的时候会不适应,但是时间久了会发现它效率很高。
Mac下用Xcode。
五 工具
文档生成工具:在VS平台下,用GhostDoc+Doxygen组合,是免费开源软件。这两个工具,前者用于直接从代码生成XML格式的注释,后者把XML格式的的注释生成样式更加美观的HTML、CHM或其他常见格式的文档。当然自动生成的注释只是根据代码的命名“猜”出来具体的注释内容,我们需要在这个模板的基础上再稍加修改。
版本控制工具:解决了新旧文件版本覆盖或者取舍的问题。推荐软件Total Commander。最流行的版本控制软件还是非Git莫属。Git支持分布开发和分支开发,《Git权威指南》这本书非常好,强烈推荐。
第二章 数据类型
一 原码、反码、补码
1 整型数据用补码。原因是它能解决原码和反码各自的问题。原码的问题是正负相加不为0,反码的问题是零出现了两种表示方法。程序里避免用无符号数。原因是有符号数已经能表示足够大的范围了,实在不行还有long long 或者double型。二是它和有符号数一起参加运算时,会出现数据类型转换,产生一些不易察觉的错误。
2 整型数的溢出。可以在C的头文件limits.h中相关宏定义找到int型数据的最大、最小值。
3 避免溢出。用double型,让double溢出还真是件比较困难的事。
4 无符号数。避免在一个表达式中混合使用有符号数和无符号数,否则会出现非常不易察觉的bug。