2016来了,2015年底我报了一个编程比赛,2016年3月份开赛。
在切入正题之前,先扯点题外话吧。先自我介绍一下吧,我叫李晓登,外号拉登,爱好比较广泛,当然其中之一必须是编程了,忘记自己是什么时候出于什么原因喜欢上编程的了,我接触编程已经有2年了,这两年来,断断续续地学了些Java,也做了些东西,但是都觉得不过瘾,可能是由于我不是科班的吧,学习的路上,常常会由于一些事情而被打断,没能系统的学习编程方面的知识,所以一直到现在我都觉得比较遗憾,于是,在寒假开始之前,我就暗自下定决心,寒假一定要系统地学习编程,既然要系统学习编程,那就学c吧,我也不知道我是因为什么而做此决定,但其中很现实的一个情况是,我报名了一个编程比赛,而那个比赛只让用c和c++,个人对c++暂时没兴趣,所以就只能选择c了。
昨天正式开始学习c了,看的是谭浩强的书,看了他对c语言的概述。在此简单总结一下。
首先是c语言的背景问题,c语言的老祖宗是ALGOL60语言(1960),ALGOL60语言的儿子是CPL语言(1963),CPL语言的儿子是BCPL语言(1967),BCPL语言的儿子是B语言(1971),B语言的儿子就是C语言(1973)了,C语言一出生,就跟UNIX搅合在一起,经过若干年的发展,C语言就名震天下了,10年后,即1983年,美国国家标准化协会(ANSI)公布了第一个c语言标准草案,即C83,1989年,公布了一个完整的c语言标准,即C89,1990,ISO公布了另一个c语言标准C90,据说跟c89没什么区别,1999年,ISO公布了C99,但是好像没有火起来,现在大家用的基本上还是C89。看来,计算机行业也并不是越新的技术越好使,也有类似酿酒行业般——越老越香醇的例子。
然后说说c89的特点吧,大致可概括为6点,一是简洁、灵活,二是数据类型与运算符丰富,三是模块化、结构化,四是程序自由度较大,五是可以直接访问物理内存地址,最后是与汇编比起来,可移植性较好,且运行效率不比汇编逊色很多。显然这些优点足以让c语言大红大紫了。
然后说说具体c程序内容吧,前面我说过c语言是模块化的,为什么这么说呢,因为c语言的结构是以函数为单位的(函数是什么这里就不介绍了),c语言本身也提供了一个函数库,可以让我们轻松地控制计算机,但是函数也是有版权的,所以需要特别注意一下,函数在调用前,一定要在头文件中声明,否则就会产生侵权问题,程序无法运行下去了。其中函数中有一个很重要的角色,那就是main函数,它是程序执行的入口,一个项目中只能有一个,也就是说,一个程序只能有一个执行入口,要不然就会乱套了,当然进了这个入口后,可以再开很多门,产生许多分支,但是最外面只有一个可以进去的门,产生分支的问题属于多线程的范畴了,在此不去深究。那么函数有什么用呢,它就是用来处理数据的,处理完后,一般都会吐出一个东西出来,那就是返回值,当然也有处理完后不吐东西的函数,那就是没有返回值的函数了,那么函数的组成是什么呢?一个函数由返回值类型、函数名、括号、形式参数、函数体组成,返回值类型就是c语言里的那些数据类型,无返回值的用void表示,函数名由函数的功能决定,括号是用来起标识作用的,括号里面放的是形式参数,用来给函数传递数据的,函数体里面就是用来存放我们的命令的,各种控制语句和变量都可以往里面搁,你想要他干什么,你就往里面写什么,当然你要写得计算机能够读懂,否则就会报一堆错,谈到报错,就说说调错吧,一般的编程工具都有报错功能,告诉你什么地方出了什么错误,但是是用英文表达的,所以大家还得学好英语,否则看不懂了,这里需要特别注意的是,大部分编辑器在报告行数的时候,是以分号为准的,就是说如果一条语句写成了两行,编辑器就只把它当成一行,所以造成最后编辑器告诉你出错的那一行并没有出错,反而是邻近的行数出错了,所以大家一定要注意上下行有没有出错,不要局限于报错的那一行。
最后就是程序调试的问题,我个人遇到一个问题,就是写了这样一条语句scanf("%d,%d",&a,&b),然后我在调试的时候给a、b赋值的时候并没有加上逗号,结果老是运行出乱七八糟的结果,我当时被弄傻了,以为是程序是写错了,但是编译器又没报任何错误和警告,我检查程序也觉得没错,弄了好久,终于在高人的指点下搞懂了,这里也验证了一个道理,即程序不怕出逻辑错误和语法错误,就怕出调试错误。因为这种错误是隐藏的。还有一个问题就是c语言中的for循环中的循环变量最好是在外部声明(Java常常写在里面,所以我有点不习惯)因为如果没有在外部声明,而for循环又出现在main函数的首部,那编译器就会报错,说for循环不能出现在main函数的首部,具体什么原因,我也搞不懂。希望高人指点。
好了,今天到此结束,明天继续。
|