第一天 开始学习C语言
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://hyhgd.blog.51cto.com/347087/87466 | ||||||||||||||||||
开始学习C语言
欢迎使用山姆出版社的《二十一天学会C语言》这章你将开始你成为一名熟练程序员的征程,今天你将学会:
* 为什么C语言是最佳编程语言
* 编程的步骤
* 怎样编写、编译、运行你的第一个C程序
* 关于由编译、链接程序产生的错误提示信息
C语言的简介
你或许会对C语言的由来以及它名字由来产生兴趣。C语言是由丹尼斯·里奇于1972年在贝尔实验室编写成的。最初C语言是并不是为了兴趣而编写,而是一个特殊的目的--设计UNIX操作系统(现在仍在许多电脑上使用)。从它诞生之日起,C语言就被作为高效的--帮助忙碌的程序员完成工作。
因为C是如此强大、灵活的语言,它的使用很快推广到贝尔实验室之外。各地程序员开始使用它编写各种不同的程序。然而,很快不同的组织使用它们自己的C语言版本,并且在细微处存在很多不同,这开始让程序员感到头疼。为了解决这个问题,美国国家标准学会在1983年建立了一个委员会来制定对于C语言的标准定义,被称为ANSI标准C语言。期望,每个C编译器都能支持这个标准。
关于名称由来,是因为在此之前产生了B语言,其由贝尔实验室的肯·汤普森开发,你应该能猜到它为什么叫B语言。
为什么使用C?
如今,有许多高级语言可供选择,比如:C,Pascal,Basic以及JAVA。对于大多数编程任务,它们都非常出色。即使如此,这有许多原因让电脑专家认为C在它们之中是最为优秀的:
*C是一个强大的灵活性语言。C对你没任何限制,你能用它做什么完全受限于你的想像力。C适应于各种不同的工程,像操作系统、文字处理、图像、表格……甚至于编译其它语言。
*C在程序工程师里非常流行,因此,你将得到大量有效而有帮助的编译器和辅助工具。
*C是一个可移稙语言,意味着你为一个操作系统(比如IBM的PC机)写的程序,你只须做少许甚至不做修改,它就能够在诸如DEC的VAX系统上编译运行。可移稙性是标准ANSIC语言对C编译器的要求。
* C 语言有很少的内部语句,包含少量的条款,这些构成C语言功能性基础的词被称为关键字。你也许会认为包含越多关键字(有时也称为保留字)的语言越强大。这并不正确。当你用C进行编程的时候,你将发现,它几乎能完成所有的任务。
* C 是模块化的语言。C代码能够(并且应该)被写在常规函数中。这些函数能够被其它程序所使用。通过将信息传递给函数,你能写出有效的,实用性的代码。
正如以上优点显示,C作为你的第一个编程语言,是个绝佳的选择。那么,C++呢?或许你听说过C++以及面象对象编程。你会对C与C++的不同产生好奇,并且会问,是否应该学C++取代C。别担心,C++是C的一个强大组合,也就说C++包含并支持了C代码,只是为面象对象增加了一些东西。如果你继续学C,在C中你学到的大多数都将适用于C++。
通过对C的学习,你不仅将学会最流行、最强大的编程语言,并且也将为面象对象而作好准备。
另一个赢得别人目光的语言是JAVA,像C++一样,JAVA也基于C。如果在后期,你决定要学JAVA,你将发现,你在C上学到的大多数知识仍将适用于JAVA。
准备编程在解决问题的时候,你应该选择正确的方法。首先你得描述出问题。如果你不知道问题所在,你不能找到一个适合的解决方法!在知道了问题之后,你将做出个计划来解决它。有了计划,你还得执行它,最后,你得检查这个问题是否得到解决。同样的逻辑方式在许多领域都很实用,包括编程。
你在用C(或其它语言)进行编程的时候,你应该遵照以下步骤:
1.决定程序的项目;
2.决定程序的算法;
3.编程
4.运行程序,查验结果.
一个项目(步骤1)可以是一个文字处理软件或数据库程序。一个更简单的项目是在显示器上显示你的名字。如果你没有项目,你不会编写程序,所以编程之前你得将第一步完成。
第二步是选择你编程的算法。你是否需要电脑来解决这个问题?你将查看哪些信息?你将使用哪些工具?在这个步骤中,你应该决定好,你需要知道什么,以什么样的方式来解决这个问题。
举个例子,设想有人叫你来编写个程序以计算圆的面积。现在已经知道了你的项目。第二步来决定你需要知道些什么来计算面积。在这个例子中,设想程序使用者将提供圆的半径。知道这个之后,你能想到使用面积方程pr2 来计算面积。你已经完成了第一、二步了,你可以开始第三步和第四步了,它们合称为编程环节。
编程环节 编程有它自己的步骤,第一,你使用编辑器来创建个包含源代码的文件;第二,你对源代码进行编译,产生个目标文件;第三,链接编译好的代码,创建个可执行文件;第四,运行生成的程序来检验它是否按你的原计划运行。
编写源代码源代码是一串让计算机按你所计划的任务来运行的命令指令。正如上面所提,编程的第一步是使用编辑器来输入源代码,下面是一个C语言源代码的例子: printf("Hello, Mom!");
这段源代码使计算机在屏幕上显示,Hello,Mom!(现在,不要担心不知道这条代码是如何运行的)
使用编辑器大多数编译系统都包含有内置的编辑器供你输入源代码,然而有些却并不提供。查询你编译系统的使用手册来看你的编译系统是否有编辑器。如果没有,有许多编辑器可供选择。
许多计算机系统都有支持文档编辑的软件。如果你使用UNIX系统,你可以使用诸如ed,ex,edit,emacs或者vi等软件;如果你使用微软视窗系统,它包含有记事本;如果你使用MS/DOS5.0或者后续版本,你可以使用Edit,如果是5.0以前的版本,你可以使用Edlin;如果是PC/DOS6.0或更新的版本,你可以使用E;如果是OS/2系统,你可以使用E和EPM。
大部分文字处理软件都有它独特的编码来规范它的文件。这些编码不能正确地被其它程序识别。美国信息交换标准码(ASCII)有个特殊的标准来规范几乎所有程序的编码,包括C语言。许多文字处理软件,比如WordPerfect, AmiPro, Word, WordPad, 和 WordStar,都以ASCII码的形式来保存源文件(是以文本格式而不是文档格式)。当你需要对文字编辑软件以ASCII码进行存档的时候,注意选择ASCII或文本选项。
如果还没有一个让你想使用的编辑器,你可以购买一个其它的编辑软件。世面上有很多专为输入编程代码设计的商业性和共享性的软件。
注意:在你当地的电脑商店或者你邮箱的广告目录以及电脑杂志的广告栏里你都可以找到独特的编辑器。
当你保存代码文件的时候,你必须给它命名。名字应该能够描述程序的功能。并且,你还得以.c作为它的扩展名。仅管你能够给源代码任意的名字和扩展名,.c被认为是最正确的扩展名。
编译源代码 仅管你能够懂得C的源代码(至少在你阅读完这本书后,你能够),你的电脑不会。计算机需要被称为机器语言的二进制或字节指令。在你运行C程序之前,它必须由源代码翻译为机器语言。这种翻译,编程环节的第二步,由被叫作编译器的程序进行的。编译器将源代码作为输入,产生个包含机器指令的磁盘文件。由编译器产生的机器语言指令被称为目标代码,那个磁盘文件被称为目标文件
注意:本书遵从ANSI标准C语言。意味着,只要你按照ANSI标准,不论你使用哪种C编译系统都可以运行本书代码。
各个编译器需要它自己的命令来创建目标代码。通常,你需要通过在编译器里键入命令并加上源文件名。下表是不同的DOS/Windows编译环境下编译RADIUS.C源文件的命令的例子:
在UNIX系统中使用下列命令编译RADIUS.C: cc radius.c
请查阅你所使用的编译器的用户手册来获取编译器的正确命令。
如果你使用图形开发环境,编译就更简单了。在大部份图形开发环境中,你可以通过选择编译按钮或者从菜单中选择相应选项来编译你的程序。完成编译后,你可以通过选择运行按钮或者在菜单中选择相应选项来执行程序。在使用编程环境之前,你应该查阅你编程环境的手册来获取编译、运行程序上的方法。
在编译完成后,你将获得个目标文件。如果你查看编译文件目录或文件夹,你将找到和你源文件名称一样的但以.OBJ(而不是以.C)为扩展名的文件。以.OBJ为扩展名的文件被认为是目标文件,它被链接器使用。在UNIX系统中,编译器创建的目标文件以.O为扩展名而不是.OBJ。
链接并创建可执行文件在运行程序前还需要一个步骤。一部分C语言包含了目标代码(已经过编译的代码)实现预定义功能的函数库。预定义函数包括一些已经编写好并提供即时使用功能的、集成于编译器中的C代码。
在前面例子中使用的printf()函数就是一个库函数。库函数解决一些常用功能,比如在屏幕显示消息,从磁盘文件读取数据。如果你的程序使用这些功能(几乎没有任何程序需要少于一个这些功能),目标文件在源代码被编译并与目标代码合并的时候产生,在生成可执行文件(可执行意味着你的程序可以在电脑上运行)时使用。生成可执行文件的过程被叫作链接,提供此功能的程序被叫作链接器。
完成编程环节 在你的程序经编译、链接,产生了可执行文件之后,你可以在系统命令提示中输入它的名字使它运行,也可像运行其它程序一样运行它。如果你运行的程序或其它产生的结果不是你所期望的,你得返回第一步。你必须找到产生这样结果的原因并且在源代码中进行修改。在修改源代码后,你得再次编译、再次链接来创建正确的可执行文件版本。如此循环直到产生你所期望的可执行程序。
关于编译和链接的提示:尽管编译和链接分为两个独立的步骤介绍,但许多编译器,像前面提到的DOS编译器将两步合为同一个步骤。不要在意以哪种形式完成编译和链接,你需要明白这是两个过程,即使只需要一个命令来完成,但它实际是两个独立的动作。
C程序编程环节
图表显示了编程的步骤。在完成程序即使是最小的程序之前也应反复多次进行以上步骤。即使是最熟练的程序员也不可能仅用一次写出一个完整、无错的程序!在你运行程序之前你得反复循环地编辑、编译、链接、测试,所以你得对你的工具:编辑器、编译器、链接器非常熟悉。
第一个程序 你肯定非常急切地尝试你的第一个C程序。为了使你熟悉你的编程环境,这有个小程序来让你学习。现在,你可能不能明白所有的东西,但你能感受到编写、编译并且运行一个C程序的过程。
这个实例使用一个被称为HELLO.C的程序,使用它你仅仅可以在屏幕上显示:Hello,World!这上小程序是C程序的经典入门实例,对你学习非常有帮助。HELLO.C的源代码在实例1.1中。当你输入的时候,不要包含行号和它前面的冒号。
实例1.1. HELLO.C.1: #include <stdio.h>2:3: main()4: {5: printf(“Hello, World!\n”);6: return 0;7: }
确认你已经安装了编程环境。不论你使用UNIX,DOS,或是其它的操作系统都要让自己知道怎样使用你选择的编译、链接器。准备好编程环境后,按步骤输入、编译、执行HELLO.C。
输入编译HELLO.C根据以下步骤输入、编译程序HELLO.C:
1. 激活你编写的C程序所在目录,并且运行你的编辑器。正如前面提到的,你可以使用任意编辑器,不过大多数编程环境(比如Borland公司的 Turbo C++以及微软公司的Visual C/C++)都具有集成开发环境(IDE),只须一步简便的设置就可以让你在其中进行输入、编译、 和链接你的程序。查阅你的用户手册来看你的编程环境是否具备集成开发功能。
2. 使用键盘输入实例1.1中完整的HELLO.C的源代码。每行以“回车”结束。
注意:不要输入行号以及冒号,它们只起提示作用。
3.用HELLO.C的文件名保存源代码。
4.展开文件目录或打开文件夹来核实HELLO.C是否保存在磁盘上。你应该在目录中看到HELLO.C。
5.按照你编程环境的用户手册来执行准确的命令。完成后,你应该收到个无错误、无警告的提示信息
6. 检查编译器的信息。如果你接受到无错误、无警告的提示信息,一切都很顺利。
如果你在输入源代码时出错,编译器会发现这个错误并将它通过个提示信息展示出来。比如,如果你将printf错拼为prntf,你将会看到与如下相类似的提示信息: Error: undefined symbols:_prntf in hello.c (hello.OBJ)
7.如果有这条提示信息或者有其它错误信息,请返回第二步,打开你编辑的HELLO.C的源文件,将你的文件内容与实例1.1进行比较并做出任何必要的更正,完成修改后,继续第三步。
8.现在,你的第一个C程序已经编译好了,并且可运行了。如果你打开一个包含所有HELLO文件(任意扩展名)的文件夹,你将会看到下列文件:
HELLO.C, 你用编辑器输入创建的源代码文件
HELLO.OBJ 或者 HELLO.O, 包含HELLO.C目标代码的文件
HELLO.EXE, 在你完成对HELLO.C编译、链接之后创建的可执行程序。
9.简单地在命令提示中输入hello之后,运行HELLO.EXE。“Hello,World!”这条信息,将显示于屏幕上。
恭喜你!你刚完成了对你第一个C程序的输入、编译和运行。诚然,这是个简单的,无任何作用的程序,但这是个开始!实际上,今天大多数的资深C程序员都是以这种方式—--通过编译HELLO.C来开始他们对C语言的学习,因此,你有很好的同伴!
编译错误 编译错误,是在编译器发现它不能编译源代码中的一些代码时产生。拼写错误、输入错误或其它错误都可导致编译器中断。值得庆幸的是,现在的编译器不再只是中断,它们将告诉你中断的原因并告诉你,错误在哪儿。这样使得查找、修改你的源代码的错误变得更容易。
这一点可以通过介绍HELLO.C里的一个经典错误来说明。如果你已完成了那个实例(你也应该完成了),现在你的磁盘中有了一个名为HELLO.C的源代码文件。使用你的编辑器,移动鼠标到包含printf()函数的最后一段,删去行末的分号。现在HELLO.C的源代码文件应该与实例1.2一样。
实例1.2. 有错误的HELLO.C1: #include <stdio.h>2:3: main()4: {5: printf("Hello, World!")6: return 0;7: }
接下来,保存文件。现在你得输入你编译器的命令来编译它。因为你加入了一个错误,因此不能完成编译过程。编译器显示出与下列相似的错误提示信息: hello.c(6) : Error: `;' expected
看这条信息,你可以看到它由三个部份构成:
hello.c 产生错误的源代码文件名
(6) : 发现错误的行号
Error: `;'对错误的解释
这条信息非常有用,告诉你编译器没有在HELLO.C的第6行找到所期望的分号。然而,你知道,分号实际上是在第5行被省的,所以这是个矛盾。你会感到困惑,为什么在第5行省略了分号,编译器却报告在第6行发现错误。这是因为C语言不会在意行与行之间的中断。分号应该放在printf()函数行后,即应该放在下一行(仅管这属于错误的编译习惯)。只有在发现了第6行的下一条命令(return)时,编译器才会确认分号已消失。因此,编译器报告错误是在第6行发现的。
这指出了C编译器和错误信息的一个不可否认的实事。仅管编译器在查找和定位错误上非常聪明,但它并不是智能的。所以你得用你的C语言知识读懂编译器的信息提示来决定它所报告错误的实际位置。通常你会在编译器报告的行找到错误,如果没有,很有可能在它的前一行找到。刚开始时,你可能在查找错误上会遇到点麻烦,但很快你将变得很擅长。
注意:错误信息的提示会因为编译器的不同而有所差别。大多数情况下,错误信息提示会告诉你,错误的原因及错误所在处。
在结束这小节之前,让我们再来看编译错误的另一个例子。再次将HELLO.C导入你的编辑器再做下面的改动:
1. 重置第5段的分号;
2. 在Hello前删除双引号。
保存文件并再次编译。这次,编译器会显示如下错误提示信息: hello.c(5) : Error: undefined identifier `Hello'hello.c(7) : Lexical error: unterminated string Lexical error: unterminated stringLexical error: unterminated stringFatal error: premature end of source file 第一条错误信息很准确地找到了错误,将错误定位于第5行的单词Hello上。错误提示信息“undefined identifier”的意思是不可识别标识符,即编译器不知道如何处理单词Hello,因为它没有被包含于引号之中。然而,被报告的其它四个错误又怎样呢?现在,你不必知道这些错误的意思,只是说明了,C程序中的一个错误在有时候会导致多个错误提示信息。
由此得知:如果编译器报告多个错误,而你只找到了一个,去改正那个错误并再次编译,你可能会发现,你的一个改正正是那些报告错误所需要的,并且你的程序会经无错的编译。
链接器错误信息相对而言链接器的错误比较少并且是由C语言库函数的拼写错误导致的。在这种情况下,你将得到个“undefined symbols:”的错误提示信息,在其前面是你拼写错误的名称(在此之前已作有下划线)。在你修改了拼写之后,错误就消失了。
总结
在这章学习之后,你应该自信地认为将C语言作为你编程语言是个明智的选择。C提供了无与伦比的功能、名声、以及可移稙性的强大组合,再加上与C++ |

