上篇要点回顾和点评:
1、 上篇谈了学习一门新语言要学会思考。请问,思考什么?
2、 上篇谈了编程流程,请问流程是什么?
3、 你自己编了helloworld程序了吗?一次编辑、编译成功了吗?
回答完了以上内容,请继续下面的内容。
本篇将对Hello world 程序作深入的解析
我们学习语言,要有好的学习方法,这就是学习或编写最少的语句,能达到对语言最佳的掌握。记住“最少”这两字。实际中很多程序员没有这个概念,能写上上千万万行程序,但是对其语言依然掌握不透。这就因为他们头脑里只看到具体的语句,具体的功能,看不到“抽象的语句、抽象的功能”,不能掌握语言的规律和原理,不能掌握学习语言的方法和技巧,不能举一反三。这些是新手们特别要注意的,千万不要向他们学呀。
不知道大家对上篇的a.c能总结点啥。一定会有人说,不就是显示一句helloworld吗?是最简单的程序了。我认同这是一个简单的程序,而且大家的关注点都在显示“hello world!”那一条语句上。但是,简单不简单,这个简单的程序包含了很多重要的内容。每行都是宝,都有讲头,都少不了。
通过这个程序我们应该掌握什么?
1、 一个完整的程序是什么。
#include “stdio.h”
main()
{
fprintf(stdout,”hello world!\n”);
exit(0);
}
这就一个最简单的完整程序,只有6行。但是它告诉我们,一个C语言是由两个部分组成:定义和函数,至少有一个主函数。第一行#include “stdio.h”我们可以把它看做定义部分。第二行到第六行我们把它看做函数部分。知道这个组成有什么用?我们就可以对我们以后编的程序进行评判了。如果我们的程序没有定义,或没有主函数则一定不是个完整的。有人会说,我就不需要定义,我说行,那只是一种例外,99.99%的应用C语言都是要有定义的。对于新手来说,我们先不学例外,我们先学些正常的。学了这个构成,我们在编写C语言的时候,我们就会在想两个问题:我们的定义是什么?我们的函数是什么?
先记住这两个部分,今后我们还会对这两个部分进行深入的分析,比如,定义部分再怎么分,函数部分再怎么分。
2、 程序的main
main这个函数也是一个语言的重要内容,有人会问,为啥必须要main函数?我写个aaa函数不行吗?如果你编写的是一个可执行程序,那可能真的不行,运行这个程序必须有一个统一唯一的入口,而C语言的这个入口这就是main。不是吗?如果没有main,你在程序中编了a函数,b函数,程序怎么知道先执行那个?是不是那个在前就先执行那个?那个在先,就先执行那个也是一种算法,但是,也有例外(今后会看到)。所以,人家规定了main为程序的入口是有它的道理的。
你跟他说main,他马上会说知道了。是真的知道吗?要真的掌握main的道理,就会在学习其他语言时候,就会有意识地去找相应的入口函数。比如,VFP中的load,C#窗体中的page_Load都是一个程序的最初的入口。
记住只要有多个函数必然就有一个主函数,找到主函数我们就可以进行最初的处理。比如初始化什么的。
当然,随着语言的发展,一些语言的主函数是可以通过用户定义的了。但是,其原理还是不变的。
3、 程序的语法
大家老是说语法语法的,什么是语法?语法就是语言的规定,是语言的法律,违背了这个规定,这个程序就玩不转,就出错。看来我们程序员编程也要受逃脱不了法制社会的约束呀。
1)#include “stdio.h”
意为包含文件,也是引用的意思。语法就是#include+“”+文件名。
如果,你把include 拼错了、没有加#、不是成对的双引号、后面多加了分号。
则编译通不过了,出错了,违法了嘛。
2)main()
意为主函数,是程序的最先的入口。函数后面必须有一对刮号。如果你换了成大刮号,换成中刮号,或只有一个小刮号,或后面加了分号就不符合语法了,出错了。函数后面是一对小刮号且没有分号就是一个语法规定。
3) {,}是函数体边界符合,在此之内都属于这个函数。不能少一个,多一个大刮号。
4、 函数的调用
编程序最常用的方法就是函数调用,函数调用就是避免重复编写编码,用现有的编码。由于,C语言中的函数调用是不收费的,能调用还不调用?虽然这是一句调侃。但是,调用函数绝对是程序员最重要的任务之一,程序员不但要调系统函数,而且要调用他人的函数,更多的是要调用自己的函数。本程序有两个函数调用:
1)fprintf(stdio,“hello world!\n”);
记住函数调用要掌握:函数名+参数+;这三个部分。
下次写函数调用一定要记住呀。少一个都不行。这个真的要记住,记住了就会在调用函数时,或想调用函数时,考虑函数名是什么?函数的参数是什么?“;”是不是忘掉写了。
在很多情况下,我们往往会注重前两者,忘记“;” 结果编译总是出错。如果你是初学者,一定要把这基础打好,在今后的编程中不要出现这个问题。
只是,当你学了不同的语言后,你往往会混淆,比如VFP中语句后面就没有“;”。这个时候,你就会在VFP中加分号,在C语言不加分号,让人哭笑不得。
2)exit(0);
这是一个退出程序的函数。有进必有出。有了出,你就可以在程序中随时中断处理,退出程序。退出函数也很重要,初学者也要牢记。参数中的0,表示程序返回值为0。在80%的情况下,程序的返回值是没有什么用的,我都处理完了,返啥都一个样。但是,在一个大的项目中,在程序之间发生关系的时候,返回值就可能是一个重要的纽带,那你就会要学会使用程序的返回值。好在我们后面的实战中有这方面的例子。这里你就会使用exit(0);就行了。一些老一点程序员会大喊,我不用exit(0),程序照样退出来。是的,没有exit(0),程序退出来的,但是,作为一个完整的程序而言,有进有出还是必须的。省了一条语句功能上应该没啥问题,但是失去了可读性了。还是加上exit(0)吧,正规的编写,会产生好的习惯,而好的习惯会让你更加正规。
5、 .h的引用
.h文件,往往是一个定义文件,定义一些常量、结构、外部数据,有些定义是有条件的。一般情况下,一个C语言至少要引用3个以上的系统文件。意为包含文件,也是引用的意思。从直白上来说,它将一部分源程序放到了外部了。这样自己的源程序看起来更加简洁。对于新手来说,#include 一般都包含一些系统的*.h 例如 stdio.h 可读作“标准io”。对以高手来说#include会包含一些自己的.h
#include 后面有“”,<> 两种方式包含文件。一般用“”就行了。除非你不用<>不行。这里我特地停下来谈一下实用问题。学语言强调就是一个实用,不是让你成为一个语言学家。就#include 而言,你掌握一种包含方法就行了,不必要弄清两者的区别。因为,在你若干年之内,可以说,你是很难取一个和系统相同的.h文件的。如果,你非要学一个从系统目录开始搜寻,一个从当前目录开始搜寻差别有意义吗?有意义的事多的去,就怕你没有时间去学。
记住:
1)#include一般情况下引用的定义文件,在特殊情况下也可以引用函数文件。或定义与函数相结合的文件。
2)#include一般情况下引用的是系统的文件,在特殊的情况下,可以引用自己的定义文件和函数文件。
6、 关键字
程序虽然只有六行,但是,像include,main都是关键字。所谓关键字就是系统启用的名字。你就不能起相同的名字了。比如,你就不能自己起一个名为main的函数。而今后,我们将会遇到更多的关键字,例如:if、else、while int char等等。有了这个初步的概念后,我们今后可以更加关注关键字,避免关键字。一般而言,水平越高的程序员,往往会碰到自己命名与系统命名重复的问题。因为他会越来越接近系统程序员,而新手则鲜有遇到这种情况。
7、转义符
程序中fprintf(stdio,“hello world!\n”);中\n是很有意思的。
\n是换行的意思。n 可以记为new line.这样就好记一些。在C语言中,一些不可显示的控制字符,是通过转意符加符号表示的。与\n一起的还有\r回车符(return)等。另外,一些关键字符\平常化,则要加\,例如\\表示\.
转义符这个在C语言中也是比较重要的概念,也是常用的。
8、流的应用
程序中fprintf(stdio,“hello world!\n”);中的stdio是一个标准输出,就是一个流。所谓流你可以把它看做一个渠道。这个渠道可以通往一个设备、一个文件,也可以通往下一个流。流是很有讲头的。内容很多,这里运行这个程序流就显示到屏幕上。
如果在命令行中输入./a.out>1.txt
则屏幕上并不显现hello world!, 而hello world!则产生到1.txt文件中去了。
在命令行接着输入cat 1.txt
就可以看到hello world!了。
这说明流被改向到文件了。
如果,你没有看到以上的归纳,你就能对新手讲了以上的内容,说明你的基础很好,反之,你只看到显示hello world!这条语句怎么写,而无话可说,我只能说你需要加强基础训练,要改变自己的学习方法,多思考,多用最小的程序去思考。
如果有人要问,我已经会编hello world!下面我该编什么?我建议去修改一下程序,显示3遍 hello world。到时候我会给程序做给评判。
本不想对hello world做深入的分析的,但是,你要成为高手,就要懂得万丈高楼平地起的道理,我还是想借这个平地,将基础的东西多讲一讲,基础好才是真的好。