C语言编程——零基础初学者指南(第3版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-17 11:30:58

点击下载

作者:[美]Greg Perry Dean Miller 著

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C语言编程——零基础初学者指南(第3版)

C语言编程——零基础初学者指南(第3版)试读:

前言

前言内容● 本书的读者对象● 本书与众不同之处● 本书的设计要素● 轻松愉快地学习C语言● 现在要做什么

看到朋友们都找到了合适的C语言编程工作,而自己却吃着闭门羹?很想学习C语言,却缺乏持续的动力?想用热门的程序设计语言给老旧不堪的电脑进行热身?本书就是你所需要的!

本书打破一般计算机书籍居高临下的说教方式,根据读者自身的程度循序渐进地讲解知识要点。它就像是读者的好朋友,坐在身旁教你C语言,用平实简单的语言而非“计算机行话”,让读者在轻松愉快的气氛中学习。与市面上的其他书籍相比,本书精练的章节、生动的插图和幽默风趣的行文,助读者更快速、更友好、更轻松地拨开C程序设计的迷雾。本书的读者对象

这是一本为新手准备的入门书,适合没有任何编程经验的初学者阅读。读者不需要具备任何编程的概念,即使从未写过一行代码,也可以通过本书学习C语言程序设计。

零基础初学者,在不同的情况下有不同的含义。许多相关的书籍和课程都将C语言作为一门技术性含量很高的语言来学习,也许你曾经学过C语言,但放弃了;也许你有其他语言的编程经验,但是第一次接触C语言。如果是这样,本书就是你最佳的选择。经过32章的学习,你一定会对C语言有所了解。本书与众不同之处

本书不会用深奥难懂的内部技术细节吓倒C语言的初学者。我们坚信,应该耐心细致地帮助初学者学好基本概念。在夯实基础后,理解“更困难”的部分会容易些。本书将告诉读者,什么才是初学者应该掌握的C语言入门知识。

C语言可以说是一门非常神秘而难懂的语言,许多人尝试多次学习都未果。其实,问题很简单:如果能作适当地解释,任何一门学科(无论是脑外科、邮件分类,还是C语言编程)都不难。师傅领进门,学艺靠自身。只有自己下功夫才能真正学到知识。但是,如果指导学习的教师、书籍,或视频在教学过程中过于沉闷死板、毫无乐趣,就无法调动学生的学习积极性。

本书提供的学习方法特别适合零基础的初学者学习C语言,但是他山之石,可以攻玉。如果读者发现了比本书更简单易懂的教学方法,请联系我们,我们会第一时间研读一番(你也许认为我们会退款?)。言归正传,本书为初学者开辟了一条与众不同的学习之路,竭尽全力地帮助初学者打好基础。

本书最大的优势在于,我们不仅非常热爱C语言编程,而且更热衷于教C语言。我们坚信,读者会在学习中爱上C语言。本书的设计元素

与其他计算机书籍一样,本书包含了许多有用的提示、注意、警告等。我们在读者需要特别注意的地方,都做了补充说明。读者在阅读过程中,会发现很多特别的图标和边栏。提示 本书中的许多技巧和小窍门都以此图标提醒读者注意。该部分内容包含一些语言特性和编写代码的技巧,指导读者如何加以利用。注意 在C语言中,需要对某些主题进行更深层次的理解。该图标提醒读者注意一些可能没有考虑的部分,例如正在讨论的主题有一个新的用法。警告 该图标指出正在讨论的内容中可能会出现潜在的问题。它表明读者要多加留意或提供一个妥善的解决方案。

本书每章开头都有“本章内容”的预览,每章末尾都为读者归纳了本章必须掌握的知识要点,“本章小结”部分是本书的特色之一,将每章的重要知识点放在一起,方便读者记忆。

本书使用的排版风格如下:● 代码行、变量和所有出现在屏幕上的文本都用等宽字体(如,

monospace);[1]● 格式行中的占位符用斜体等宽字体(如,italic monospace);● 程序中由用户输入的部分用加粗等宽字体(如,bold

monospace);● 新术语采用楷体;● 语法解释中的可选参数用方括号([ ])括起来。使用这些参数时,

不需要写出方括号。轻松愉快地学习C语言

附录B中的“Draw Poker扑克游戏”是一个完整的程序。该程序在不牺牲代码可读性和游戏功能的前提下,尽可能短小精悍。为了让该游戏能在所有的C编译器中成功运行,游戏中不会出现精美的图案。但是,随着深入学习C语言,读者可以通过编译器轻松地加入各种特定的图形、声音和数据输入例程来改进程序。

该程序占了本书十几页的篇幅,正文中会介绍一些与Draw Poker扑克游戏程序相关的内容。市面上绝大部分书籍都只提供代码的片段,本书提供了每章程序示例和Draw Poker扑克游戏程序的完整代码,能让你掌握该游戏的设计大局。随着学习的深入,读者会越来越了解这个游戏。现在要做什么

请翻开下一页,开始学习C语言吧!

[1] 译者注:格式行中的占位符译文用斜楷体。第一部分初识C语言1 什么是C程序设计本章内容● 理解C程序设计的基本要素● 找到并安装C编译器● 学习编程过程的步骤

许多人都认为C语言难学难用,不过你很快会发现事实并非如此。C语言被认为是一门神秘的程序设计语言,它的确可以成为这样的语言。但是,具有良好编程风格的C语言程序,也可以像其他程序设计语言编写的程序一样,简单易懂。当今社会对程序员和开发者的要求越来越高,学习C语言为进入各个领域(如,应用开发、游戏编程等)打下了坚实而有效的基础。

如果你从未编写过程序,不用担心,本章将从最基本的编程概念开始介绍,解释什么是程序,并简要介绍C语言的历史。C语言是一门功能强大的程序设计语言。1.1 什么是程序

计算机并不聪明。信不信由你,即使在你状态最糟糕的时候,你的智力也绝对超过计算机好几光年。你可以独立思考,告诉计算机要做什么。当然,计算机也有自己的专长:它服从你的指令。而且,计算机可以不知疲倦、不计报酬、日以继夜地处理你提供的数据。

计算机无法自己决定做什么,它不能独立思考,因此程序员(告诉计算机应该做什么的人)必须给计算机提供非常详细的指令。没有指令,计算机将一无是处,但是给予错误的指令,它也无法成功地执行你分配的任务。正如汽车无法自己启动并行驶在街区上,没有详细的指令,计算机也无法处理你的工资单。为了让计算机执行某项具体的任务而提供的详细指令集称为程序(program)。注意  字处理软件、应用程序、电子制表软件和电脑游戏都是计算机程序。脸谱(Facebook)也是程序的集合。没有这些程序,计算机只能无所事事地呆在那里,不知道下一步要做什么。字处理程序包含一系列详细指令(用计算机语言编写,如C语言),告诉计算机如何处理文字。当你编写程序时,就是在告诉计算机,要按照你所写程序中的指令来执行。

你可以为计算机、平板电脑、手机等购买或下载各种程序。但是,如果公司因业务需要,必须使用计算机来执行某些具体的任务,那么该公司就要请程序员和软件开发人员,根据公司的具体业务需求开发软件。虽然用计算机或移动设备可以做许多事情,但是现有的程序可能无法满足你的具体要求。本书将助你摆脱进退两难的困境。学习C语言后,你可以编写包含各种指令的程序,告诉计算机如何执行程序。提示 计算机程序告诉计算机如何按你期望的方式执行任务。正如厨师做菜需要食谱,程序需要指令才能生成结果。食谱就相当于一系列的指令集,如果编写得当,执行顺序合理,每一步骤需要的食材准备充分,就能烹饪出可口的饭菜。对于计算机而言,程序就相当于厨师的食谱。

在运行(run)或执行(execute)程序时,会生成输出(output)。如果将做好的菜看作是食谱的输出,那么字处理软件或应用程序就是运行程序生成的输出。警告 如果厨师在烹饪过程中放错食材或跳过食谱中必要的步骤,做出的菜一定不太美味。与此类似,如果输入错误或跳过某一步骤,你的程序将无法运行。1.2 编写C语言程序需要什么

在计算机上编写并执行C语言程序之前,需要一个C编译器(C compiler)。C编译器用于创建(build)或编译(compile)C程序(编译是一个技术术语,指将程序转换为计算机可读的内容),让你在需要查看结果时可以运行已编译的程序。现在有许多非常优秀且免费的软件包,可以用它们来编辑并编译你的C程序。通过网络搜索即可找到诸多这样的软件。本书使用的是Code::Blocks(www.codeblocks.org)。提示 如果在搜索引擎中查找“C Programming Compilers”,会搜索出许多免费的软件,其中包括Borland和Microsoft提供的。但是,为什么本书使用Code::Blocks?因为它为各种操作系统(Windows、Macs和Linux)提供了不同的版本,无论你用什么操作系统都可以使用Code::Blocks。

如果你正打开Code::Blocks的主页,阅读网站的第一行,可能会有些担心:The open source, cross platform, free C++ IDE.(开源、跨平台、免费的C++集成开发环境)

开源(open source)指的是用户可以更换或改进软件的代码(现在想这样做尚早,暂时将其放在一边)。跨平台(cross platform)意味着该软件可以在不同的操作系统上运行。作为初学者,只需要关注自己所使用的平台即可。免费(free),不言自明。IDE是集成开发环境(integrated development environment)的缩写,这意味着可以用其编写、编辑和调试程序,不需要切换其他软件。我们很快就会接触到调试。

不要因为看见C++而担忧。在Code::Blocks中,既能编写C程序也能编写C++程序。目前,要找到一个纯正的C编译器比较困难。因为C编译器都会附带C的更高级版本,即C++。因此,在寻找C编译器的同时,你会发现它一定是C和C++组合的编译器,而且一般都会强调C++的功能。这非常不错,在学习C语言后,你已经有一个C++编译器。等将来学习C++,就不用再去学习新IDE的输入和输出。

Code::Blocks的主页,如图1.1所示。要下载C/C++集成开发环境,只需单击页面左侧主菜单中的“Downloads”选项即可。图1.1 Code::Blocks的主页(请留意“Downloads”选项)

在选择“Downloads”选项后,将弹出另一个页面,对3个选项作进一步讨论:Binary、Source和SVN。后两个是高级选项,初学者可以忽略。请单击“Download the binary release”即可。注意 安装时需注意两点。第一,本书的屏幕截图与你在互联网上所见的主页可能稍有不同——Code::Blocks会不断更新软件,其版本号会不断增加。我在编写本书时使用的Code::Blocks版本号为10.05,但是出版前最后核实,其版本号已更新至12.11。在你拿到本书时,版本号可能会更大。第二,如果你是Windows用户,确保你下载的是较大的文件(标题中有mingw)。这个版本包含测试工具,在你成为资深C语言程序员时会用得上。

下一页显示的各选项,依操作系统而异。如果选择Windows选项,请继续选择第二个选项,如图1.2所示。这样即可下载完整的编译器和调试器,迟早用得上。图1.2 选择Windows集成开发环境下载(可选择任意一个下载源进行下载)

在确定开始下载后,可以去干点别的(找点东西吃)——下载的文件较大,下载时间依你的网速而定。下载完成后,点击文件并接受所有默认设置(只有资深的程序员才会根据自己的需要进行安装)。很快,就能在计算机上运行Code::Blocks了。退出“每日提示”(Tip of the Day),并将Code::Blocks相关的程序都设置为.c和.cpp文件后,才能关闭文本窗口。此时,屏幕上显示的是该软件的视窗,如图1.3所示。图1.3 欢迎来到编程之家注意 你编写的C程序叫作源代码(source code)。编译器将C源代码翻译成机器语言(machine language)。计算机由成千上万的电路开关(开或者关)组成。因此,计算机最终的指令必须是二进制(binary),前缀bi-代表“二”。电路的两种状态被称为二进制状态(binary state)。用C编译器将C程序转换为1和0(表示内部的开或关的设置),比你亲自愚公移山要容易得多。1.3 编程过程

绝大多数程序员在编写程序时,都按照以下几个基本步骤进行。

1.确定程序要做什么。

2.使用编辑器(editor)编写并保存你的程序设计语言指令。编辑器类似于文字处理软件,可以创建和编辑文本。所有流行的C编译器都包含一个集成编辑器和程序设计语言编译器。所有的C程序文件名都以 .c扩展名结束。

3.编译程序。

4.检查程序错误。如果出现错误,将其逐一修复并返回步骤3。

5.执行程序。注意 计算机程序中的错误被称为bug,处理错误称为调试(debug)程序。

花点时间学习Code::Blocks或你安装在计算机上的其他编译器。功能强大的IDE使用统一的菜单,让你在相同的环境下轻松完成以上5个步骤。在编译程序、查看错误、修复错误、运行程序、查看结果时,无需切换界面。警告 对于从未编写过程序的新手,可能不太理解上述内容。别紧张,现在绝大多数C编译器都有内置教程,你可以通过阅读教程学习编译器、编辑器和编译命令的基本知识。

如果你仍然不理解为什么需要编译器,可以这样想:源代码就像是计算机需要的原材料,编译器就像是将原材料转变成最终产品的机器。计算机只能看懂经过编译的程序。1.4 使用C语言

C语言比绝大多数程序设计语言效率更高,同时它也是一门小型的程序设计语言。也就是说,需要学习的C命令(command)并不多。通过本书的学习,你将掌握C命令和C语言的其他要素(如,运算符、函数和预处理指令等)。

C语言发展至今,经过了很多版本的修订。美国国家标准学会(ANSI)委员会为C语言的所有版本制定了一系列规则(称为ANSI C)。如果用ANSI C编译器能编译某个程序,就能保证所有安装ANSI C编译器的计算机都能编译该C程序。提示 1983年,ANSI创立的X3J11委员会建立了一个C语言的标准版本,称为ANSI C。在2011年采用了ANSI C的最新版本——C11。

如果你编译了一个C程序,那么无论其他计算机是否安装了ANSI C编译器,只要与你的计算机兼容,就能运行这个C程序。你可能会说:“太棒了!但是,我连第一个C程序都不会写,哪懂编译、运行。”别急,在第2章中,我们会一步一步地教你如何编写C语言程序。

本章小结

本章介绍了C程序设计语言,帮助读者选择一个编译器编辑、调试和运行程序。

要牢记以下几点。● 首先要在计算机上安装一个C编译器。● 准备好学习C程序设计语言。● 不要认为C语言很复杂。本书会以通俗易懂的方式讲解C语言的

概念。勤加练习,你便会得心应手。2 编写第一个C程序本章内容● 编写第一个程序● 使用main()函数● 识别数据类型

本章将教你如何编写第一个C程序!如果无法理解本章的所有内容,请不要着急。放轻松些,你的目标是先熟悉C程序。经过本章的学习,你要学会识别所有C程序的共同元素。2.1 概述

本节将介绍一个简短但完整的C程序,并讨论附录B中的另一个程序——“Draw Poker扑克游戏”。这两个程序都包含一些共同和不同的元素。第一个程序相当简单:/* 在屏幕中打印一条消息 */#include main(){  printf("Just one small step for coders. One giant leap for");  printf(" programmers!\n");  return 0;}

打开你的编程软件,输入以上程序。很简单吧,也许你不是第一次使用新的编译器。如果第一次使用Code::Blocks,将会出现“Tip of the Day”(每日提示)。这些提示今后会很有用,但是现在,可以先关闭它。

创建程序,要单击File Menu并选择New,然后在弹出的子菜单选项中选择Empty File。现在,你可以在干净的文件中开始编写以上程序了。

输入程序后,需要编译或建立程序。单击左上角的黄色小齿轮,即可完成该步骤。如果你肯定键入的程序准确无误,可以单击小齿轮旁边的绿色向右箭头。(这一行后面的图标,是齿轮和箭头,都是编译和运行程序。简化生活从减少点击数开始,随着学习的深入,你必须从单击两次减少为一次。)

在编译(或建立)程序并运行时,会出现如图2.1所示的界面。图2.1 第一个程序的输出注意 为了在屏幕上显示一行消息,背后完成了许多工作!实际上,在程序的8行代码中,只有以printf开头的两行执行输出任务。其他代码行都是C程序所共有的。

请翻开附录B,浏览一下较大的程序。虽然Draw Poker扑克游戏占了十几页篇幅,但是,它包含了上面小程序中的共同元素。

仔细对比这两个程序,注意它们的类似之处。首先注意到的应该是花括号({})、圆括号(())和反斜杠(\)。在C编译器中键入C程序时要注意,即使微小的错误也会导致程序无法编译。例如,在应该键入{时却键入了[。警告 除了要避免键入错误的字符,在文字处理软件中键入代码后,再将其复制进IDE时也要当心。我在Word中已写好前面的程序,然后将其复制进Code::Blocks中,在编译程序时,出现了许多错误。因为在Word处理软件中创建的引号(printf那两行)是智能引号(看上去有一定的斜度),编译器无法识别它们。随后我删除了这些智能引号,在编辑器中重新键入,代码便成功通过编译。如果你的程序出现问题,首先检查引号使用是否得当。

C语言不会在所有情况下都那么吹毛求疵。今后你所见的C程序中都包含大量的间隔,添加这些间隔是为了提高代码可读性,并不是C语言要求的。在你编写程序时,适当添加空行和增加代码缩进都能提高代码的可读性,方便查找定位。提示 要使用Tab键进行缩进,而不是键入一连串空格。大部分C编辑器都允许调整制表符间距(tab spacing,按下Tab键时出现的空格数)。有些C程序的代码行很长,所以,将Tab设置为3就足够,这样代码行不至于太长。

C语言规定所有的命令和预定义函数(下一节将介绍什么是函数)都使用小写字母。只有在#define行和打印的消息中才会用到大写字母。2.2 main()函数

C程序中最重要的部分是main()函数。前面讨论的两个程序中都有main()函数。main()是一个C函数,不是C命令。现在还不需要区分它们。函数是执行某些任务的例程。C程序由一个或多个函数组成。每个程序必须包含一个main()函数,除此之外,有些函数是你创建的。函数与命令的区别在于,函数名后紧跟一对圆括号。以下所示都是函数:main()  calcIt()  printf()  strlen()

而这些都是命令:return  while  int  if  float

在阅读C程序设计的书籍、手册和网页时,作者可能会省略函数名后面的圆括号。例如,你可能会读到printf函数而不是printf()函数。稍后我们将介绍如何识别函数名,是否有圆括号并不是区别函数的重要特征。大多数时候,作者都会尽可能地区分函数和非函数,因此,在本书中你通常都会看见圆括号。警告 以上所列的函数中,calcIt()包含一个大写字母。然而,前面的内容中提到不允许使用大写字母。如果函数名中包含多个部分(如,doReportPrint()),通常的做法是:从第二个单词开始,每个单词的首字母用大写(函数名中不能出现空格)。不能将所有单词都用大写表示,但是为了提高代码的可读性,偶尔用一下大写字母也未尝不可。

main()函数和C提供的所有函数名都必须包含小写字母。可以在函数名中使用大写字母,但是,绝大多数C程序员都遵循小写字母函数名的惯例。

正如上网要首先打开主页,计算机总是从main()开始执行程序。即使程序中的main()不是第一个函数,程序仍然从main()开始执行。因此,为了提高可读性,在编写代码时应将main()作为程序的第一个函数。在接下来几章的程序中,都只有一个函数:main()。在你具备一些C的编程技巧后,我们会讲解为什么将其他函数置于main()后能提高程序性能。第30章,将教你如何编写自己的函数。

在main()后面(或下面)一定有一对花括号,以左花括号({)开始,以右花括号(})结束。当然,main()中也可能有其他的花括号对。请再次翻到附录B,查看一下较大程序的代码,练习查找main()函数和花括号。main()是第一个包含代码的函数,后面的其他函数都有花括号和代码。注意 几乎所有的C程序都有#include ,要包含这条指令才能打印和获取数据。从现在开始,记住将这条指令放在main()之前。第7章中会讲解#include的重要性。2.3 数据的种类

C程序所使用的数据由数字、字符和单词组成。程序将数据处理为有意义的信息。在C程序设计中有各种不同类型的数据,最常见的三种数据类型是:● 字符● 整型数● 浮点型数(也称为实数)提示 你也许会问:“我需要具备多少数学知识?!这不公平!”别急,轻松点,C语言会帮你处理数学的问题。不一定非要学会2+2才能写C程序。但是,你必须要理解数据类型,否则无法为自己的程序选择合适的类型。

2.3.1 C语言中的字符

C语言中的字符是计算机可以表示的任意单个字符。计算机知道256个不同的字符,每个字符都能在ASCII表中找到(ASCII读作“askee”),请参阅附录A。只要是计算机能表示的,都可以作为字符。以下所列都能看成字符:A  a  4  %  Q  !  +  ]注意 美国国家标准学会(ANSI)制定了ANSI C和ASCII表。提示 即使按下空格也会生成一个字符,C编译器不仅要记录字母、数字和所有其他字符,还要记录程序中需要的任何空白。

如你所见,对C语言而言,每个字母、数字和空白都是字符。4看上去是一个数字,但有时它也是一个字符。如果指定4是字符,就不能用来做数学运算。对于特殊的符号也是如此。加号(+)是一个字符,但是它也能执行加法运算。(好吧,又聊到数学上了,我们不谈数学!)

在C语言中,所有的字符数据都要用一对单引号(’ ’)括起来。单引号将字符数据与其他类型的数据(如,数字、数学符号等)区分开来。例如,在C程序中,以下所列都是字符数据:‘A’  ‘a’  ‘4’  ‘%’  ‘ ’  ‘_’

下面这些都不是字符数据,因为它们周围都没有带单引号:A  a  4  %  _提示 以下所示都不是有效的字符。只有单个字符才能放进单引号中,多个字符不行。‘C is fun’‘C is hard’‘I should be sailing!’

前面介绍的第一个程序中有一个‘\n’,你也许认为\n不是单个字符。但是,它是一个双字符组合,在C语言中将其视为单个字符。稍后会作详细解释。

如果要指定多个字符(除了特殊字符组合,如\n),将其放在一对双引号(” ”)中。包含多个字符的组合称为字符串(string)。下面是一个C语言的字符串:

“C is fun to learn.”注意 关于字符和字符串,现在你只需要掌握这些。第4章至第6章,将介绍如何在程序中使用它们。在学到如何在变量中储存字符后,你会理解单引号和双引号的重要性。

2.3.2 C语言中的数字

也许你不曾想过,数字有许多不同的大小和形状。无论什么样的数字,C程序都必须以相应的方式来储存,必须将数字储存在数字变量中。在了解什么是变量之前,先复习一下数字的分类会对你有所帮助。

完整的数字称为整数(integer),整数即是没有小数点的数。记住:任何没有小数点的数都是整数。以下所示都是整数:10  54  0  -121   -68  752警告 整数不要以0开头(除非这个数字是0),否则C语言会认为你键入的是十六进制或八进制数字。十六进制和八进制也分别称为基底为16的数制系统(base-16)和基底为8的数制系统(base-8),它们都是计算机表示数字的特殊方式。例如,053是一个八进制数,0x45是一个十六进制数。如果你实在不知所云,只需记住,如果在整数前加0,C语言就会启动十六进制。

带小数点的数字称为浮点数(floating-point number)。以下所列都是浮点数:547.43  0.0  0.44384  9.1923  -168.470  .22提示 如上所示,在浮点数前加0没有问题。

使用整数还是浮点数取决于程序处理何种数据。某些值只能使用整数(如,年龄和数量),而另外一些值则要使用精确的浮点数(如,金钱或重量)。在内部,C语言储存整数和存储浮点数的方式不同。如图2.2所示,浮点数占用的内存是整数的两倍。因此,如果能用整数尽量用整数,给浮点数留点空间。图2.2 浮点数占用的内存通常比整数多注意 如图2.2所示,无论储存的数值是大是小,整数所占用的内存都比浮点数少。在现实生活中,邮局的大邮箱很可能比小邮箱中装的信件少,邮箱中的内容不会影响邮箱的容量。同理,在C语言中,储存数字所占用的内存大小取决于待储存数字的类型,而数字的值不会影响储存该数字的内存大小。2.4 第二个程序示例

本章的目标是,让读者熟悉C程序的大体样式,着重理解main()函数,其中包含可执行的C语句。C语言的格式比较自由,虽然对空白未作严格规定,但却对小写字母吹毛求疵。C语言要求所有的命令和函数都用小写字母,如printf()。

目前,不要求读者理解本章代码中的细枝末节,本书会在后面章节做详细讲解。但是,再次提醒读者,尽可能多动手编程——实践出真知!多写代码能增加你对编码的信心。下面介绍本章的第二个程序,其中涵盖了之前介绍过的数据类型:/* 使用字符、整数和浮点数据类型的程序 */#include main(){  printf("I am learning the %c programming language\n", 'C');  printf("I have just completed Chapter %d\n", 2);  printf("I am %.1f percent ready to move on ", 99.9);  printf("to the next chapter!\n");  return 0;}

这个小程序包含本章介绍过的3种数据类型:字符(C)、整数(2)和浮点数(99.9),将在屏幕上打印3行消息。注意 第一个printf语句中,%c告诉程序要插入字符’C’。%c中的c是字符的缩写,并不代表字符是C。即使你想表达“I am learning the N programming language”(我正在学习N程序设计语言),在C语言中仍然要使用%c来插入’N’字符。

main()函数只是程序员在程序中写的一个函数。main()的代码以及程序中其他函数的代码,都要放在左右花括号({和})之间。printf()函数是内置的C函数,用于输出。下面是该程序的输出:I am learning the C programming languageI have just completed Chapter 2I am 99.9 percent ready to move on to the next chapter!提示 多次运行这个程序,尝试改变消息和数据。你甚至可以故意打错代码,例如忘记在句末加分号(;),看看编译会出现什么情况。从错误中学习,你会成为更好的程序员!

本章小结

本章介绍了C程序的大体样式,让读者熟悉了main()函数。

本章要点归纳如下。● 在C语言中,函数名后必须紧跟一对圆括号。C程序由一个或多

个函数组成。程序中必须有main()函数,C程序首先执行main()

函数。● 在C程序中多用空白,提高代码的可读性。● 不要在整数前加0,除非这个整数是0。● 字符要用单引号括起来,字符串要用双引号括起来。整数是完整

的不带小数点的数。浮点数是带小数点的数。3 代码的注释本章内容● 给代码加注释● 注释详述● 空白● 另一种风格的注释

必须确保计算机和他人都能看得懂你写的代码。计算机是机器,你必须小心正确地编写C程序,才能让计算机按照你期望的方式运行。另一方面,代码不只是给机器看,他人也会阅读你的程序。你可能经常改动程序,要查看以前写过的代码;或者为公司写程序,需要根据实际情况更新代码。因此,你应该为程序写文档,解释该程序的作用。3.1 给代码加注释

要在C程序中添加注释(comment)。注释分散于程序各处,用于解释程序中各部分的作用。如果你编写一个计算工资的程序,应该在程序相应的位置注明计算工资总额、计算各项税款、计算社保金额,诸如此类。注意 你可能认为,如果编写的程序只给自己看,没必要加注释。并非如此,C是一门不太好懂的程序设计语言。即使是自己编写的程序,时间长了再看也不一定记得当时的思路(你可能忘了为什么要写这段代码)。如果当时添加了注释,就不会出现这样的尴尬。提示 现在就养成良好的习惯:在写程序的同时,就加上注释。程序员一般很少回头再添加注释。不要在日后改动代码时后悔当初没加注释。在写程序的同时为其加上注释,还有一个好处。你经常会在写程序的过程中,查看之前写过的语句。通过浏览注释,很快就能定位查找的部分。如果没有注释,你不得不一段一段地重新解译C代码。

程序维护(maintenance)是指随着时间推移不断修改程序的过程。在维护期间,修复程序隐藏的bug和调整程序,以适应不同的环境。如果你为公司写了一个工资管理程序,该公司最终可能改变工资的计算方式(例如,将两周一结改为一周一结),你(或其他程序员)不得不更改工资管理程序以符合公司的要求。注释能让程序更便于维护。通过查看代码的注释,你或其他程序员能快速地浏览程序,更快地找到需要修改的部分。

注释不是C命令。C语言会忽略程序中的所有注释。注释是给人看的,除注释以外的编程语句是给计算机看的。考虑下面的C语句:return ((s1 < s2) ? s1 : s2);

你目前尚未掌握C语言,但即使已经掌握,也需要费些脑筋才能理解这条语句。这样写是否好些?return ((s1 < s2) ? s1 : s2); /* 返回较小的值 */

下一节讲解注释的语法。但是现在,你只需了解在/*和*/之间的消息就是注释。

与写C代码不同,注释应写得口语化。另外需要注意的是,不要为了注释而写注释。下面语句的注释就没用:printf(“Payroll”); /* 打印单词“Payroll” */警告 虽然你还不懂C语言,但也没必要为上面的语句加这样的注释!添加多余的注释就是浪费生命,这样的注释不会给程序带来任何便利。在加注释时要考虑到,注释是给那些阅读你程序的人看的,注释解释了这部分用来做什么。3.2 注释详述

C语言的注释从/*开始,到*/结束。注释可以在程序中跨越多行,放在任何需要注释的地方。以下所示都是C语言的注释:/* 该注释的开头到结尾,   正好跨越了两行 *//* 这行注释只占了一行*/for (i = 0; i < 25; i++) /* 从0开始计数到25 */注意 注释可占一行或多行,可以位于程序设计语句之前或之后。注释的位置依注释的长度和注释所描述的代码数量而异。

附录B中的Draw Poker扑克游戏程序包含了所有类型的注释。通过阅读程序中的注释,即使不懂C语言的代码,你也能明白程序要做什么。

不用每行代码都加上注释,通常隔几行才需要注释。许多程序员都喜欢将多行注释置于一部分代码之前,并且在需要加注释的个别代码行插入一些简短注释。下面是一个完整的程序,其中包含了不同类型的注释。/* 第3章的第一个代码。 自1994年以来,教会无数新手程序员编写超级棒的代码!*//* 欢迎Dean Miller的加入! *//* 文件名 Chapter3ex1.c *//* 计算购买节日礼物的总开销 */#include main(){  float gift1, gift2, gift3, gift4, gift5; /* 用于储存费用的变量 */  float total; /* 用于储存总额的变量 */  /* 询问为每个人买礼物的金额 */  printf("How much do you want to spend on your mom? ");  scanf(" %f", &gift1);  printf("How much do you want to spend on your dad? ");  scanf(" %f", &gift2);  printf("How much do you want to spend on your sister? ");  scanf(" %f", &gift3);  printf("How much do you want to spend on your brother? ");  scanf(" %f", &gift4);  printf("How much do you want to spend on your favorite ");  printf("C Programming author? ");  scanf(" %f", &gift5);  total = gift1+gift2+gift3+gift4+gift5; /* 计算购买礼物的总开销 */  printf("\nThe total you will be spending on gifts is $%.2f", total);  return 0; /* 程序结束 */}

许多公司都要求程序员将自己的名字放入注释中,置于程序的顶部。如果今后需要改动该程序,可以方便联系最初编写代码的程序员。此外,将文件名也纳入顶部的注释中,方便在需要建立打印列表时快速查找。注意 本书在某些地方的注释可能稍多,特别是在开头几章的代码中。我们的初衷是为了让读者熟悉注释,在某些细小的地方作进一步解释,能更好地帮助读者理解代码。提示 你会发现将一小段代码放入/*和*/中注释掉,很方便测试。这样做以后,C语言会忽略这部分代码,你可专心测试剩余部分代码。但是,不要注释掉一段已包含注释的代码,因为注释不能内嵌。C语言发现第一个*/时,就认为注释已经结束,如果发现第二个*/没有匹配的/*,将会报错。3.3 空白

空白(whitespace)是指程序中的空格和空行的集合。从某种程度上,空白甚至比注释更重要,它能提高代码的可读性。在阅读C程序时,合理安排空白的程序比没有空白的程序,可读性高很多。请看下面的程序:#include main(){float a, b;printf("How much of a bonus did you get?");scanf(" %f",&a);b = .85 * a;printf("If you give 15 percent to charity, you willstill have %.2f.", b);return 0;}

对C编译器而言,这是个不错的程序,但是你读起来却头痛不已。虽然代码很简单,但是要费很大劲才能读懂。而下面的程序,即使没有注释,阅读起来也轻松许多:#include main(){  float a, b;  printf("How much of a bonus did you get? ");  scanf(" %f", &a);  b = .85 * a;  printf("If you give 15 percent to charity, you will still ");  printf("have %.2f.", b);  return 0;}

上面这两段程序完全相同,只是前者未留空白,而后者有大量空格和空行。决定程序可读性的是空白的数量,而不是程序的物理长度。(当然,适当的注释也能提高程序的可读性,但这里主要是让读者理解没有空白和留空白的区别。)注意 你可能很好奇,为什么前面挤在一起的程序,#include独立一行,没有在后面写代码?毕竟,如果在#include这行后面接着写,整个程序的可读性就更差。Code::Blocks(和许多其他编译器)不允许在#include这行(或任何以井号(#)开头的语句)后面紧跟代码。3.4 另一种风格的注释

现在的C编译器也支持另一种源于C++程序的注释。自C99发布以来,美国国家标准学会(ANSI)委员会就认可了这种新的注释方式,因此,你可以在程序中放心地使用(除非你用的是非常非常古老的计算机和编译器)。这种风格的注释开始于双斜杠(//),在本行末尾结束。

下面是新风格的注释示例:// 另一个代码示例,不同风格的注释。#include main(){  printf("I like these new comments!"); // 一个简单的语句}

两种风格的注释都可以使用,因此,本书的代码示例中会交替使用。读者要熟悉两种风格的注释,方便以后在编写复杂程序时灵活应用。

本章小结

必须在程序中添加注释——这不是给计算机看的,是给人看的。C程序不太好懂,注释能帮助你理解程序。

本章要点归纳如下。● 在编程时为程序加上注释,再怎么强调都不为过。大量的注释让

你的代码清晰易读。● 多行注释开始于/*,结束于*/。C语言将/*和*/中的内容都视为注

释。● 如果需要单行注释,可以使用//。C语言会忽略该行//之后的内容。● 多留空白(空格和空行),提高程序的可读性。4 在屏幕上显示结果本章内容● 如何使用printf()● 打印字符串● 转义序列● 转换字符● 代码示例

如果你和其他人都看不到程序的输出,这个程序就没什么用(无法看到结果,也无法进行调试)。无论如何都要看到程序的结果。C语言主要通过printf()函数进行输出,这是C语言使用最频繁的函数之一。虽然没有实际的命令执行输出,但是printf()函数是每个C编译器的一部分。4.1 如何使用printf()

简而言之,printf()在屏幕上生成输出。本书前面的第2章和第3章中都演示了printf()将字符、数字和单词显示在屏幕上。printf()有许多可选的数据输出方式,不必成为一个了解所有printf()的专家(极少程序员能做到)才能用它在屏幕上输出。

4.1.1 printf()的格式

printf()函数有多种形式。一旦你习惯了printf()的格式,它就非常好用。下面是printf()的一般格式:printf(控制字符串 [ , 数据]);

本书会在第一次介绍新命令或函数时,给出它们的基本格式。这种格式是语句的一般形式。如果格式中的一部分出现在方括号中(如,上面printf中的数据),那么这部分内容就是可选的。在使用时不用键入方括号。如果命令中需要方括号,会在格式后面的文本中清楚地说明。printf()中的控制字符串必不可少,但是后面的数据是可选的。警告 实际上,printf()并未将输出发送至屏幕上,而是将其发送至计算机的标准输出设备。绝大多数操作系统,包括Windows,都是按照某些路线将标准输出发送至屏幕上,除非你足够了解内部原理,可以将其发送至别处。大多数情况下,都可以忽略这个标准输出设备,因为你只需要在屏幕上进行输出。以后会学到其他C函数,用于输出至打印机和硬盘。注意 你可能想知道为什么上面格式中的内容要用斜楷体。因为它们都是占位符(placeholder)。占位符是一个名称、符号或公式。本书函数和命令格式中的占位符都用斜楷体,表示可以将其替换。

下面是printf()的示例:printf("My favorite number is %d", 7); // 打印 My favorite number is 7

在C语言中,每个字符串都要放在双引号中(第2章中提到过),因此控制字符串必须用双引号括起来,控制字符串后面的内容为可选项。注意 在C语言中,每个命令和函数后都要加分号(;),C语言据此判断一行是否结束。函数的第一行(函数名和圆括号这行)不需要加分号,因为该行没有可执行的内容。不要在main()后面加分号,因为你并不是显式地让C语言执行main()。但是,你要求C语言执行printf()以及其他函数,因此所有的printf()语句(和其他函数)后都要以分号结尾。随着你对C语言越了解,就会越熟悉分号应放置何处。4.2 打印字符串

字符串信息是printf()打印的最简单的数据类型。你只需将字符串置于双引号内。下面的printf()将在屏幕上打印一条消息:printf(“You are on your way to C mastry”);

计算机执行该语句时,屏幕上会出现You are on your way to C mastry这条语句。注意 You are on your way to C mastry这条语句就是printf()中的控制字符串。这里几乎没有控制,只有输出。

下面两条语句的输出可能让你大失所望:printf("Write code");printf("Learn C");

这是两条printf()语句的输出:Write codeLearn C提示 在执行printf()时,C语言不会自动将光标移至下一行。如果你希望C语言在执行完printf()后将光标移至下一行,必须在控制字符串中插入转义序列。4.3 转义序列

C语言包含许多转义序列(escape sequence),几乎每个程序中都要用到。表4.1列出了一些常用的转义序列。表4.1 转义序列代码描述\n换行\a警告(计算机铃声)\b退格\t制表\\反斜杠\’单引号\”双引号注意 转义序列好像很难理解。在C语言中,转义序列作为单独字符储存,各种常用转义序列产生的效果如表4.1所示。当C语言将’\a’发送至屏幕时,会响起计算机铃声,而不是打印字符\和a。

可以在printf()函数中使用许多转义序列。如果在打印文本时,想“移至”下一行就必须键入\n,C语言会自动换行,将闪烁的光标移至屏幕下一行。下面的printf()语句将消息分两行打印在屏幕上,因为第1行语句中包含\n:printf("Write code\n");printf("Learn C");提示 \n也可以放在第2行双引号内的开头,输出的结果与上面相同。必须将转义序列放在双引号中,才能让C语言知道转义序列是待打印字符串中的一部分。下面的语句也将打印两行消息。printf("Write code\nLearn C");

双引号表示字符串的开始和结束,单引号表示字符的开始和结束,反斜杠标志着转义序列开始。它们(双引号、单引号、反斜杠)都有自己的转义序列。\a让计算机响铃,\b让光标在该行回退,\t输出一些空白。还有许多不同的转义序列,但是到目前为止,这些已经够用了。

下面的程序示例用于说明表4.1中转义序列的用法。和之前一样,你最好亲自将程序输入编译器并运行,然后再尝试修改一下程序:// 第4章程序示例#1// 文件名 Chapter4ex1.c#include main(){  /* 如何使用最常用的转义序列 */  printf("Column A\tColumn B\tColumn C");  printf("\nMy Computer\'s Beep Sounds Like This: \a!\n");  printf("\"Letz\bs fix that typo and then show the backslash ");  printf("character \\\" she said\n");  return 0;}

将程序输入编译器并运行,屏幕上将显示以下输出:Column A Column B Column CMy Computer's Beep Sounds Like This: !"Let's fix that typo and then show the backslash character \" shesaid注意 要认真理解上述的内容。首先,必须将#include 置于所有程序的开头,因为在stdio.h中定义了程序使用的printf()函数。如果漏写了这一行,程序就不知道如何运行printf(),编译器将会报错。此外,对于\t转义序列,不同的C/C++编译器可能会生成不同数量的空格。最后,使用\b转义序列时会擦写(overwrite)之前的内容。因此上面所示程序的输出中,在本应打印’z’的地方(Letz)打印的是’s(’Lets)。4.4 转换字符

如果要打印数字和字符,必须告诉C程序如何正确地打印它们。在C语言中,用转换字符(conversion character)指明数字的格式。表4.2中列出了一些C语言最常用的转换字符。表4.2 转换字符转换字符描述%d整数%f浮点数%c字符%s字符串

如果希望在字符串里打印值,将转换字符插入控制字符串即可,然后在控制字符串的右边列出待打印的值。图4.1解释了如何用printf()打印3个数字——整数、浮点数和另一个整数的值。图4.1 转换字符确定printf()如何打印数字

字符串和字符都有自己的转换字符。虽然在打印字符串时不必写上%s,但如果需要将字符串与其他数据一起打印,可能会用到%s。下面所示的printf()使用不同的转换字符打印不同类型数据的值。printf("%s %d %f %c\n", "Sam", 14, -8.76, 'X');

printf()生成的输出如下:Sam 14 -8.760000 X注意 字符串Sam要用双引号括起来,对所有的字符串都要这样做。字符X要用单引号括起来,对所有的字符都是如此。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载