《21天学通C语言(第6版•修订版)》一1.5 第一个C语言程序

1.5 第一个C语言程序

21天学通C语言(第6版•修订版)
读者也许迫不及待地想编写第一个C语言程序。为帮助读者熟悉编译器,程序清单1.1包含一个小型程序,功能快速地完成。现在,读者也许无法理解其中的所有内容,但不用担心,尽管编写、编译并运行它。

这里的演示使用的是一个名为hello.c的程序,该程序只是将单词“Hello, World!”显示到屏幕上而已。该程序常被用来介绍C语言编程,很适合读者进行学习。程序清单1.1列出了hello.c的源代码。输入该程序清单时,请不要输入最左边的行号和冒号。

程序清单1.1 HELLO.C

1:  #include <stdio.h>
2:
3:  int main(void)
4:  {
5:   printf("Hello, World!\n");
6:   return 0;
7:  }

请务必按软件提供的安装说明安装编译器。无论您使用的是Linux、DOS、UNIX、Windows还是其他操作系统,请务必理解如何使用您所选择的编辑器和编译器。准备好编译器和编辑器后,请按下面的步骤输入、编译并执行HELLO.C。

1.5.1 输入并编译hello.c

要输入并编译hello.c,请按下面的步骤进行:

1.在要存储C语言程序的目录中启动编辑器。正如前面指出的,可以使用任何文本编辑器,但集成开发环境(IDE)自带的大多数编译器(如Borland的Turbo C++和Microsoft 的Visual C++)都能让您以一种方便的设置来输入、编译和链接程序。请查看用户手册,了解编译器是否有IDE。

2.通过键盘输入hello.c中的源代码,内容应同程序清单1.1完全相同。换行时,请按Enter键。

请不要输入行号和冒号,它们是为了便于引用而提供的。
3.保存源代码,将其命名为hello.c。

4.通过列出目录中的文件列表,验证hello.c是否已被保存到磁盘中。文件列表中应包含文件hello.c。

5.编译并链接hello.c。执行编译器用户手册指定的命令,您将看到一条消息,指出没有任何错误和警告。

6.查看编译器消息。如果没有任何错误和警告,则说明一切正常。

如果输入的程序不正确,编译器将捕获您犯的错误,并显示错误消息。例如,如果将printf输入为prntf,您将看到一条与下面类似的消息:

Error: undefined symbols:_prntf in hello.c (hello.OBJ)

7.如果出现错误消息,请返回到第2步。在编辑器中打开hello.c,将该文件内容同程序清单1.1进行仔细比较、修正,然后进入到第3步。

8.至此,您的第一个C语言程序应编译好,可以执行了。此时如果显示所有名为hello的文件,将看到以下文件:

hello.c:使用编辑器创建的源代码文件;
hello.obj或hello.o:其中包含hello.c的目标代码;
hello.exe:编译并链接hello.c时创建的可执行程序。
9.要执行hello.exe,只须执行hello命令即可,消息“Hello, World!”将显示在屏幕上。

祝贺您!您已经输入、编译并运行了您的第一个C语言程序。应该承认,hello.c是一个很简单的程序,并不能完成任何有用的工作,但它开了一个头。事实上,当今大部分专家级C语言程序员都是以同样的方式——编译HELLO.C——开始学习的。

如果您使用的是附录G介绍的Bloodshed Dev-C++编译器,请阅读附录G,其中介绍了如何安装该编译器以及如何使用它来创建程序。该编译器可用于Windows 95或更高的版本中。
1.编译错误
当编译器发现源代码中的某些内容无法编译时,将发生编译错误。拼写错误、印刷错误等都可能导致编译器停止工作。好在现代的大多数编译器不仅仅是停止工作,还会告诉您问题出在哪里!这使得查找和修改源代码中的错误更容易。

可以有意在前面输入的hello.c程序中加入错误来说明这一点。如果您完成了前面的范例,磁盘上将有hello.c的一个拷贝。在编辑器中打开该文件,然后将光标移到printf( )所在行的末尾,并删除最后的分号。此时,hello.c的内容如程序清单1.2所示。

程序清单1.2 hello2.c:有错误的hello.c

1:  #include <stdio.h>
2:
3:  int main(void)
4:  {
5:   printf("Hello, World!")
6:   return 0;
7:  }

然后保存该文件。现在可以编译它了,方法是执行编译器命令。由于刚才引入的错误,编译将无法完成。编译器将显示与下面类似的错误:

hello.c(6) : Error: ';' expected

上述消息包含三部分:

hello.c:有错误的文件的名称:
(6):错误所在行的编号;
Error: ‘;’ expected:对错误的描述。
上述消息包含大量的信息,它指出:编译器发现hello.c第6行应该有一个分号,但没有。然而您知道,实际上是第5行遗漏了一个分号,这与消息所指出的不符。为何编译器报告第6行有错误,而实际上是第5行遗漏了分号呢?问题的答案在于,C编译器并不关心行之间的换行符,printf( )语句之后的分号也可以放在下一行的开头(虽然这样做容易引起混淆,不是一个好的编程习惯)。编译器遇到第6行的下一个命令后,才能确定遗漏了一个分号。因此,编译器指出第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 string
Lexical error: unterminated string
Fatal error: premature end of source file

第一条错误消息正确地指出了错误——第5行的Hello。错误消息undifined identifier意味着编译器无法识别Hello,因为它没有用引号括起。然而,其他4条错误消息呢?这些错误消息(现在无须关心它们的含义)表明,C语言程序中的一个错误有时候可能导致多条错误消息。

我们从中得到的教训是:如果编译器报告了多个错误,而您只找到一个,请修复该错误并重新编译。您可能发现,只须修改一个地方,程序便没有任何错误,并能通过编译。

2.链接程序的错误消息
链接程序错误比较少,通常是由于错误拼写C语言库函数的名称引起的。在这种情况下,将显示错误消息Error: undefined symbols:,后面为拼错的名称(名称前有一个下划线)。更正拼写后,问题将得到解决。

时间: 2024-09-13 23:56:28

《21天学通C语言(第6版•修订版)》一1.5 第一个C语言程序的相关文章

《21天学通Java(第6版)》—— 导读

前言 21天学通Java(第6版) 有些革命出其不意地吸引了全世界的眼球.Twitter.Linux操作系统和电视剧<Cupcake Wars>的异军突起颠覆了传统思维模式. 而Java语言的巨大成功却在人们的意料之中.自从Java语言于17年前面世以来,人们就对它充满殷切的期望.当Java融入到Web浏览器时,公众以无比的热情欢迎这种新语言的到来. Sun公司创始人Bill Joy在介绍这种新语言时,毫不掩饰其孤注一掷的心态:"15年来,我们一直力图开发出一种更佳的编程语言和环境,

《21天学通Java(第7版)》—— 2.2 变量和数据类型

2.2 变量和数据类型 在第1章创建的应用程序MarsRobot中,您使用变量来跟踪信息.变量是程序运行时能够存储信息的地方.可在程序的任何地方对其中的值进行修改--因此被称为变量. 要创建变量,必须提供名称并指定它存储的信息类型.还可以在创建变量的同时给它指定初始值. 在Java中,有3种变量:实例变量.类变量和局部变量. 正如第1章中指出的,实例变量用于定义对象的属性. 类变量定义类的属性,适用于类的所有实例. 局部变量用于方法定义乃至方法中更小的语句块中.仅当Java虚拟机执行这些方法或语

《21天学通Java(第6版)》—— 2.4 字面量

2.4 字面量 21天学通Java(第6版) 除变量外,还可以在Java语句中使用字面量.字面量可以是任何直接表示一个值的数字.文本或其他信息. 下面的赋值语句使用了字面量: 其中的字面量2012表示整数值2012.数字.字符和字符串都是字面量.Java有一些特殊类型的字面量,它们表示各种数字.字符.字符串和布尔值. 2.4.1 数字字面量 Java有几种整型字面量.例如,数字4是一个int类型的整型字面量,可将其赋给byte或short类型的变量,因为它足够小,在这些整数类型的取值范围内.位于

《21天学通Java(第6版)》—— 1.7 问与答

1.7 问与答 21天学通Java(第6版)问:实际上,方法是在类中定义的函数.既然它们无论从外观和行为方面都类似于函数,为什么不将它们叫做函数呢? 答:有些面向对象编程语言确实将它们叫做函数(C++将它们叫做成员函数).其他一些面向对象语言将位于类(对象)内.外的函数区分开来,因为在这些语言中,使用不同的术语对理解每个函数的工作原理至关重要.因为其他语言有这种区别,同时术语"方法"在面向对象技术中很常用,所以Java也使用这个术语. 问:实例变量和实例方法同类变量和类方法之间有何区别

《21天学通Java(第6版)》—— 2.8 问与答

2.8 问与答 21天学通Java(第6版)问:如果将一个超出变量取值范围的整数值赋给该变量,将发生什么情况? 答:从逻辑上说,您可能认为该变量将被转换为与之接近的更大类型,但情况并非如此.相反,将发生溢出,即从一个极端回到另一个极端.例如,byte变量的值从127(可接受的值)变到128(不可接受)时,将转到最小的可接受值,即−128,然后往上增大.您并不希望程序中发生溢出,因此将值赋给变量时,不应超过其所属数据类型的取值范围. 在计算机的内存很少,每个字节的内存都很金贵时,使用byte等较短

《21天学通Java(第6版)》—— 第 1 章 Java基础

第 1 章 Java基础 21天学通Java(第6版)Java试图解决众多领域的问题,实际上也确实在这方面取得了极大的成功.它让程序员能够开发应用程序服务器和手机程序.进行科学编程.编写软件以及星际导航等. --Java语言之父James Gosling如是说 1995年首次发布时,Java编程语言是一个用于万维网的颇具创意的玩具,但有很大的发展潜力. "潜力"是一个有时限的恭维之词.潜力迟早需要变成现实,否则将被"衰弱"."浪费"."

《21天学通Java(第6版)》—— 1.3 对象和类

1.3 对象和类 21天学通Java(第6版)面向对象编程是基于现实世界的情况进行建模的,对象由多种更小的对象构成. 然而,组合对象只是面向对象编程的一个方面,另一个重要特征是使用类. 类是用于创建对象的模板.使用同一个类创建的每个对象都具有相似的特性. 类包含一组特定对象的所有特性.使用面向对象语言编写程序时,并不定义各个对象,而是定义用于创建这些对象的类. 使用Java编写网络程序时,您可能创建Modem类,它描述了所有计算机调制解调器的特征,其中一些常见的特征有: 连接到计算机的串行端口:

《21天学通C++(第7版)》导读

前言 21天学通C++(第7版) 对C++来说,2011是个很特别的年份.在这一年,C++11终于获批成为新标准,它新增了一些可提高编程效率的关键字和结构,让您能够编写更优质的代码.本书旨在帮助您循序渐进地学习C++11,其中的章节经过仔细编排,从实用的角度介绍这种面向对象的编程语言的基本知识.读者只需每天花1小时,在学完本书后,就能掌握C++11. 学习C++的最佳方式是动手实践.本书包含丰富的代码示例,有助于读者提高编程技能,请务必亲自动手尝试这些代码.这些代码片段都使用了(在本书编写时)最

《21天学通C++(第7版)》——17.2 典型的vector操作

17.2 典型的vector操作 21天学通C++(第7版) std::vector类的行为规范和公有成员是由C++标准定义的,因此,遵循该标准的所有C++编程平台都支持本章将介绍的vector操作. 17.2.1 实例化vector vector是一个模板类,需要使用第14章介绍的方法进行实例化.要实例化vector,需要指定要在该动态数组中存储的对象类型: 要声明指向list中元素的迭代器,可以这样做: 如果需要可用于修改值或调用非const函数的迭代器,可使用iterator代替const

《21天学通C++(第7版)》——17.6 问与答

17.6 问与答 21天学通C++(第7版) **问:vector会改变其存储的元素的顺序吗? 答:**vector是一种顺序容器,元素的存储顺序与插入顺序相同. **问:要将元素插入到vector中,应使用哪个函数?元素将插入到vector的什么位置? 答:**成员函数push_back将元素插入到vector末尾. **问:哪个函数用于获悉存储在vector中的元素个数? 答:**成员函数size ()返回存储在vector中的元素个数.对于所有STL容器,该函数都如此. 问:随着vecto