Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6740
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -10
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-14 22:27
文章分类
文章存档

2016年(1)

我的朋友
最近访客

分类: C/C++

2016-05-30 23:05:43

C语言恐怕是中国大中专院校每个理工科学生必学的课程,甚至就连高中的课程也添加了这一选修课程。有些人说学习C语言挺简单的,但更多的人却觉得C语言是个很难掌握的程序设计语言。笔者书写本文,主要是想将自己学习C语言过程中的体会分享给大家,同时也说说自己走过的弯路让大家绕过这些坑。本文针对的读者是C语言的初学者,所以高手们可以直接跳过本文了。对于本文中错误的,请大家多多包含。



一、理清C语言与程序设计之间的关系

很多人觉得C语言不好掌握,就觉得程序设计很难。
C语言如同是我们写字用的毛笔,初期使用毛笔固然有些困难,但我们并不是只能使用毛笔来写字。除了毛笔,我们还可以选择铅笔、钢笔。如果C语言给我们的程序设计带来了一些困难,我们也可以选择其他的优秀的设计语言。C语言仅仅是程序设计过程中用到的一个工具而已,我们不能因工具难以掌握而放弃设计程序。
程序设计如同是写文章,我们只要将我们的想法用程序设计语言表述出来就可以了。刚开始设计程序的时候,我们可能把代码写得丑陋不堪甚至错误百出。但通过长时间的实践,我们也可以编写出优美的代码。我们应该从心理上克服恐惧心理,但就算有恐惧心理也不要太担心,因为你所经历也是那些高手们必定经历过的。

二、选择几本优秀的教材

市面上的C语言程序设计教材种类繁多,但也是良莠不齐。这些教材从作者的角度可以分为三类:一是国内教授编写的教材,代表作就是大名鼎鼎的谭浩强版的《C语言程序设计》;二是民间人才编写的教材,比如刘蕾编写的《21天学通》;三是国外专家编写的教材,比如《C程序设计语言》。从读者程度层面上也可以分为三类:入门、提高和升华。
第一本教材的选择非常重要,因为它很大程度上影响着读者对C语言的理解以及代码风格的形成。并不是有意贬低谭浩强版的《C语言程序设计》,但笔者确实觉得需要提一下。国内大学本科理工科学生都要求人手一本,谭浩强版的书,上课使用的是它,考试内容也是它。按理说,大学教材应该是严谨的,但这本书没有同一的代码风格,里面也有一些错误。笔者在此推荐的教材是Stephen Prata编写的《C Primer Plus》,推荐的主要原因是它对知识点讲解比较细腻,而且比较遵从最新的C语言标准,代码风格也比较同一。当然还有大量优秀教材,大家可以考虑选择。

三、99+1式学习

如果我们已知的知识点只有1个,但要学习99个未知的知识点,这肯定是困难的。但如果我们已知的知识点已经有99个,这个时候我们学习一个未知的知识点,那就非常容易了。同样的,我们在练习的时候,不要一下子就将很多个自己新学的东西体现在代码中。这样编写的代码容易出错,而且就算编译通过了,自己的感悟也不是很深。我们应该搭积木式地编写代码,这样的学习效率最高,感悟也深。比如我们想编写一个计算两数之和的代码,可以按照下面的步骤一步一步来。
首先,我们编写一个helloworld程序,该代码用到了#include指令、main()函数的定义以及printf()标准库函数的调用。同时这个代码也可以验证我们的开发环境是否搭建成功:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     printf("hello, world!\n");

  5.     return 0;
  6. }

如果这个代码编译成功并且输出正确后,我们可以将其改造成一个较为复杂的代码:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int num1 = 1;
  5.     int num2 = 2;
  6.     int num3;
  7.     
  8.     num3 = num1 + num2;
  9.     printf("%d + %d = %d\n", num1, num2, num3);

  10.     return 0;
  11. }

上面的代码新使用了变量的声明以及初始化、变量的赋值,还使用了printf()函数的新用法。我们还可以再改造一下,让它变得更复杂:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. void fun(void);

  3. int main(void)
  4. {
  5.     fun();

  6.     return 0;
  7. }

  8. void fun(void)
  9. {
  10.     int num1 = 1;
  11.     int num2 = 2;
  12.     int num3;
  13.     
  14.     num3 = num1 + num2;
  15.     printf("%d + %d = %d\n", num1, num2, num3);
  16. }

这似乎就是两数相加的代码,但总感觉缺点什么。我们继续改造:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int add(int num1, int num2);

  3. int main(void)
  4. {
  5.     int num1 = 1;
  6.     int num2 = 2;
  7.     
  8.     printf("%d + %d = %d\n", num1, num2, add(num1, num2));

  9.     return 0;
  10. }

  11. int add(int num1, int num2)
  12. {
  13.     return num1 + num2;
  14. }

但这貌似也不是我们想要的,再改造一次吧。这样,我们就得到了最终的代码是:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int add(int num1, int num2);

  3. int main(void)
  4. {
  5.     int num1, num2;
  6.     
  7.     printf("Input the first num: ");
  8.     scanf("%d", &num1);
  9.     printf("Input the second num: ");
  10.     scanf("%d", &num2);
  11.     
  12.     printf("%d + %d = %d\n", num1, num2, add(num1, num2));

  13.     return 0;
  14. }

  15. int add(int num1, int num2)
  16. {
  17.     return num1 + num2;
  18. }

最新的代码用到了标准输入、标准输出、函数声明以及定义、函数调用。当然,如果我们熟练之后,完全可以将这些步骤一步走完。不过,对于复杂的知识点,这种方法可以降低学习时的陡峭度。

四、剥离复杂代码找到错误所在

不论是新手还是老手,编写的代码通常都会有些错误,只是多与少差别而已。有时候我们一口气编写出了大段而又复杂的代码,但编译总是不通过。修改代码的时候,我们可以将代码逻辑精简成一个简单模型,去除其他的地方,这样可以找到问题的关键。有的时候,我们甚至可以不管代码之前是如何运行的,在错误代码之前给变量赋值以达到精简代码的目的。总之,调试代码从要害入手直接寻找问题关键。

五、C语言和程序设计的听说读写译

英语中有听说读写译的说法,程序设计中同样存在。
我们阅读书籍,从零学习知识点,这就是听。我们要听那些专家对语言以及程序设计的讲解,他们所说的是他们长时间的理解、经验和见解,这可以让我们少走弯路和错路。我们确实应该选择一本好书,万万不可因为省钱买一本档次较低的书。
虽然我们听了专家的讲解,但我们应该转化为自己的知识。最简单的方法就是说,如果我们自己能够将这些东西用简单明了的话说清楚了,那就说明我们真正搞明白了。
我们要勇于并且善于阅读别人的优秀代码,尤其是开源代码。一本书上这样说道:那些不愿意开源的公司不开放代码,实际上是怕别人看到这些漏洞百出的代码后不再使用这些产品。那些开源的代码,确实是人类一大笔财富。首先,这些开源项目人人都可以得到,不必担心版权的问题。其次,这些代码确实是优秀的代码,这些代码中包含大量的理论方法和技巧。很多新手一看到超过30行的的代码就觉得头疼。我们要勇于踏出这第一步,一句一句的阅读。只要脚踏实地地慢慢阅读源码,相信不久地将来,大家都可以达到“一目十行”的程度。当然,对于新手,我们对自己的要求不要太高。我们可以把目光仅仅停留在对C语言的使用和代码风格的鉴赏。
程序设计最终是要体现在一句句的代码上。再简单的功能,我们如果不亲手写一写,就永远也不会直到真正会遇到什么问题和困难。刚开始写代码时,甚至是helloworld程序我们都要调试修改多次才能编译通过。但随着代码量的积累,我们一定会段时间内写出高质量的代码。
等到学习到一定程度,我们可以反汇编程序文件,得到C代码的汇编代码。我知道,这对新手来说有巨大的困难,学习陡峭度太高,但我们可以从最简单的一句开始慢慢做起。这样做最大的益处是,我们可以知道C语言编译后最终的结果如何,是否真的是我们想要的。而且通过看反汇编代码,我们可以直到计算机内部的运转机制和编译器特性。这对我们编写高性能的代码有非常大的好处。

六、不要在乎不必要的细节

当初笔者的老师总是喜欢提问类似(i++)+(i++)+(++i)+(++i)这种问题,或是运算符比较级与括号的问题。考试的时候,老师也非常喜欢出这种题。这种不是问题的问题,总是困扰着那时候的学生。说它们是不是问题的问题,是因为这些问题完全可以避免,而且可以处理得更优雅。但如果我们非要研究这些问题,那么只能说精神可嘉但不可取,完全是浪费时间。运算符这种东西完全可以查询手册,甚至直接加括号了事。我们应该把宝贵时间用在更重要的事情上。

七、学习C标准

我们阅读的C语言书籍必须遵从C标准,我们使用的编译器也要遵从C标准,我们编写的代码也是要遵从C标准。所以我们应该善于查询C标准,如果遇到某些模糊的问题,最好是查询它。当然,这本手册是英语写的,需要我们多花费一些时间。C标准也是有版本的,从C90到C99,再从C99到最新的C11。这些版本之间的差异,在语言上只是非常细小的细节,变化幅度大的算是标准库了。我们不一定非要学习C11,使用C11中的新特性某些特性也是不错的尝试。因为C99中普及,我们应该尽可能多地掌握C99中语法和标准库函数。



阅读(550) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~