1、第1章 C语言入门1.1 初识C程序1.2 C程序从编辑到运行1.3 变量与赋值1.4 输入与输出1.5 流程控制1.6 函数1.7 编程风格第1章 C语言入门1.1 初识C程序第1章 C语言入门对于初学者来说,C语言的词汇即关键字,接近于我们使用的自然语言(这里指英语),在某种程度上可以见名知义。下面就让我们通过一个简单的程序来认识和了解C语言。【例1.1】在屏幕上输出一行文字:欢迎使用C语言!对于上述代码,我们需要进行编辑、保存、编译和运行,从而在屏幕上输出相应的文字。编辑代码,必须有一个可以进行文字编辑的软件。Windows操作系统中自带的记事本或者MS WORD等软件,均可以完成代码的
2、编辑与存储功能。在C语言程序设计中,程序代码编写完成后保存在扩展名为“.c”的文件中,该文件即为源程序文件。我们将上述代码保存在Lianxi_1_1.c源程序文件中。由于C语言是高级语言,因此需要将源程序翻译成计算机可以识别的机器语言,也就是要对源程序进行编译。程序在编译成功以后,即可以运行,在屏幕上输出相应的文字。第1章 C语言入门程序执行后,输出结果显示在Windows的Console控制台(也称作Windows的命令行DOS框,本书中简称为控制台)中。运行结果中,在标题栏列出了当前运行的程序“Lianxi_1_1.exe”,该程序即源程序编译之后的可执行程序。控制台上显示出要求输出的文字
3、“欢迎使用C语言!”,以及该程序执行所用时间与返回值。当根据控制台上的提示“请按任意键继续”操作时,该程序运行结束。虽然例1.1仅有短短数行程序代码,但是已经具备了C语言的基本框架和特征。源程序中符号“/”后面的内容为注释,注释的作用是在源程序中对特定的代码进行简要解释,起到标记相应代码的作用,以增强程序的可读性,尤其是在复杂的源程序文件中,注释对理解源代码起到了非常重要的作用。当程序运行时,注释不会对程序产生任何作用。C语言中的注释有两种形式:(1)单行注释:使用双斜线符号“/”注释其后的内容,表示双斜线以后到本行结束的内容均为注释部分。(2)多行注释:使用一对符号“/*”与“*/”完成内容
4、注释,表示从符号“/*”开始到符号“*/”结束之间的内容均为注释,无论这些内容是在一行还是多行中。单行注释短小精悍,多用于代码中对某语句的解释。多行注释可以详细描述某个部分的具体功能。C语言编译器在编译源程序时,对注释部分忽略不计,不会为注释生成机器代码。源程序的第二行以“#”开始的部分,是一个预处理指令。该指令在对程序进行编译之前告诉预处理器,该程序要包括标准输入输出函数库。其中“stdio”是“standard input&output”的缩写,扩展名“.h”中的“h”是英文单词head的缩写,第1章 C语言入门意为头文件。C语言头文件stdio.h中包含与输入/输出相关的函数,在本程序中
5、使用的printf()函数即定义在该文件中。因此凡是涉及与输入/输出相关的函数时,需要确认标准函数库中是否已经定义,若已定义,则可以直接使用,并在源程序中应用上述预处理指令。代码“int main()”是任何C语言程序必不可少的一部分。C语言程序由一系列的函数所构成,C语言程序设计的基本单位是函数,这些函数可以在一个源文件中,也可以根据不同功能而分布在多个源文件中。在这一系列的函数中,必须有一个而且只能有一个以main为名的函数,这个函数称为主函数,整个程序由主函数开始执行,一般也是以主函数结束。该行代码中,关键字int表示该主函数需返回一个整型数值,与程序最后一行的“return 0;”相对
6、应。代码“printf(欢迎使用C语言!);”告诉计算机执行一个输出动作,它是一条可执行语句。“printf”为“print function”的缩写,是一个格式化输出函数,该函数在标准输入/输出文件stdio.h中定义。该函数将双引号中的内容输出到屏幕上。C语言的语法规定分号“;”是一条语句的终止符号,每一条可执行语句都必须以分号结束,但是只要符合语法,多条语句可以在一行书写,一条语句也可以在多行书写。第1章 C语言入门1.2 C程序从编辑到运行第1章 C语言入门一个简单的C语言程序,从编写到运行经过了几个必不可少的过程,如图1.2所示。在编辑阶段,使用文字处理软件编写代码,并将文件保存为以
7、“.c”为扩展名的源程序文件。在编译阶段,编译器(Compiler)将源程序翻译为计算机可识别和执行的机器指令,即目标程序,文件以“.obj”为扩展名。和源程序一样,目标程序也不能直接执行,需要经过连接器(Linker),将目标程序同C语言库中提供的支持程序和其他相关目标模块连接起来,然后就生成了可以直接运行的可执行文件(以“.exe”为扩展名)。连接器为C语言提供了丰富的手段,通过与外在资源的连接,迅速地扩充了C语言,从而得到了功能强大的可执行程序。Dev-C+是一个Windows环境下的集成开发环境,可用于C语言或者C+语言程序的开发。作为一款自由开源软件,它集成了众多C/C+语言开发环境
8、的优点,免费且实用。Dev-C+遵循C11标准并兼容C99标准,其开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集成了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示以减少编辑错误,具备基本的调试功能,可以进行单步语句跟踪调试。第1章 C语言入门最重要的是Dev-C+有中文界面,这也是目前很多C语言开源软件不具备的优势。该软件可通过网络免费下载使用,在下载了该软件之后,双击该软件,软件即开始自动安装;在安装完成后第一次运行时,需要对运行环境进行配置,即选取开发界面所使用的语言,如图1.3(a)所示。这时如果选择中文,软件的开发界面则为中文模式(见图1.3(b)。下面我们结
9、合例1.1来介绍如何使用Dev-C+实现从源程序编辑到程序执行的完整过程。1源程序编辑选取菜单项【文件】【新建】【源代码】,进入源代码的编辑界面。按照例1.1的内容输入代码,并保存为Lianxi_1_1.c源程序文件。在学习C语言程序之初,就应该有一个良好的编程习惯,除了前文提到的对代码进行详尽的注释之外,还应该将代码编写得错落有致,不同部分之间以空行间隔,这样程序的可读性也会随之提高。2源程序编译在程序编写完成后,选取菜单项【运行】【编译】,如图1.6所第1章 C语言入门示,即开始对源程序进行编译。编译过程中相关信息的反馈以及编译结果会显示在开发环境的编译日志中。在编译日志中,我们可以看到当
10、前编译的文件个数、文件名及所使用的编译器的名称。编译过程中会进行C语言的语法检查,对于没有遵守语法规则所引起的错误,编译器会显示错误信息,从而使程序编写人员可以很容易地定位该错误并进行修正。第1章 C语言入门如果我们将例1.1中printf语句后的分号去掉,再进行编译,就会看到,在开发界面下部的编辑器窗口中显示了错误信息,并且指明了错误产生的位置。同时,在编译日志中,也相应地指出了程序错误及错误发生的位置。在编译结果中,显示出错误发生数目(1个),而且由于编译过程中有错误产生,编译没有生成可执行程序(如图1.9所示)。3程序执行当源程序编译成功之后,即生成了相应的可执行文件,选取菜单项【运行】
11、【运行】,可运行该程序。此时,运行的是编译生成的可执行文件,而不是源程序文件。这时将弹出Windows控制台窗口,显示运行结果。第1章 C语言入门1.3 变量与赋值第1章 C语言入门【例1.2】使用C语言编写程序,实现两个整数的加法运算,并将结果显示在屏幕上。程序第一行的预处理指令引入标准输入/输出函数库,因此在程序中可以直接使用printf()标准输出函数。在主函数main()中,定义了三个变量,名称分别是a、b、sum。所谓变量,就是程序中用来存放数据的对象,在程序运行期间其值可以改变。每一个变量都应该有一个名字,即变量名,第1章 C语言入门便于在程序设计过程中使用。C语言规定所有变量在使
12、用前必须先定义,包括定义变量的数据类型和变量名。通常,变量的定义会放在函数的开始部分、其他可执行语句之前。C语言的变量除了可以定义为整型外,还可以定义为其他类型。不同的数据类型,对应的存储空间不同,存储的数据也不同。在定义变量的时候,需要遵从C语言的语法规则:变量的定义至少应包含变量的数据类型与变量名,即也可以通过逗号间隔,定义同一类型的多个变量:根据上述规则,例1.2中的三个变量可以分别定义,如下:由于这三个变量均为整型变量,也可以定义为变量必须先定义后使用,如果变量在使用之前没有定义,则在对程序进行编译时,编译器会返回错误信息,指出该变量在使用前没有定义。C语言强制要求变量在使用之前被定义
13、,可以起到以下作用:第1章 C语言入门(1)如果在定义变量时明确指定了数据类型,则程序在编译时就能为该变量分配相应的存储空间,并检查该变量的使用是否正确。(2)在定义变量时,除了指定数据类型,还需要为变量命名,如例1.2中的变量名a、b和sum。为变量命名就好像为饭店的每一个包厢指定名称一样,便于程序设计过程中对其进行操作。C语言规定变量的命名需要遵循一定的规则:变量名只能由字母、数字或下划线组成;变量名的第一个字符只能是下划线或者字母。此外,C语言对字母的大小写敏感,即认为大写字母与小写字母是两个不同的字符。因此在上述变量名中,firstName 与FirstName是两个不同的变量名。除了
14、上述两项规则以外,C语言的相关标准并没有规定变量名的长度,以及如何给变量命名,因此变量名的选择相对来说是自由的。而且C语言也没有限定变量名的长度,理论上讲,变量名可以无限长。但是为了程序书写的便利以及阅读的方便,变量名应控制在有限长度内,并且变量的名字应该有一定的含意(与英文含意相对应)。变量必须先定义后使用,但是变量也不能重复定义,因为在编译时会根据变量的类型进行空间分配,如果变量重复定义,则编译器会给出错误信息。在变量被定义以后即可以按照其数据类型来使用。变量可以在使用的时候赋值,也可以在定义的时候赋值。在定义的同时对变量进行赋值称作变量的初始化。如果变量在定义之后、使用之前没有赋值,变量
15、中所存储的数据不确定,则编译程序时并不会出错,但是程序执行的结果会出错。第1章 C语言入门1.4 输入与输出第1章 C语言入门在例1.2的程序中,对变量a和b分别赋值23与24,那么该程序只能实现对整数23与24的求和运算。如果我们想要实现对任意两个整数的求和计算,则需要将程序做适当的修改,如下例。【例1.3】编写程序,实现对任意两个整数的求和运算。对例1.3程序编译成功之后,运行该程序,Windows的控制台第一行显示结果如图1.11所示。通过键盘输入数字23之后按回车键,则显示结果如图1.12所示。通过键盘输入数字24之后按回车键,则程序计算出两个整数的和。第1章 C语言入门在程序执行的过
16、程中实现了简单的人机交互,按照程序执行过程中对数据类型的要求,通过键盘分别输入两个整数,从而实现了对任意两个整数的求和计算。在例1.3中,使用了前面提到的标准输出函数printf,给用户进行提示,并且使用了一个新的函数scanf,用于获取从键盘输入的信息。函数scanf与函数printf一样,都被定义在了标准输入/输出函数库中。因此,通过程序的预处理指令“#include”,即可在程序中使用这两个函数。在例1.3中,函数scanf通过逗号分隔开两个参数,分别是“%d”和“&a”。第一个参数,我们在例1.2中的函数printf中也用到了,该参数是格式控制字符串,指出程序希望接收的输入数据。字符串
17、“%d”中,字符“d”指出该数据应该是十进制的整型数据(字母d即decimal的首字母),“%”是一个特定的字符,指出其后紧跟格式控制符。函数的第二个参数“&a”中的字符“a”对应着前面定义的整型变量a,而符号“&”表示该变量的地址,又称作取地址运算符,表明了通过该语句输入的数据要存放到变量a中。符号“&”是函数scanf要求使用的,函数printf并不需要。例1.3中的标准输出函数printf有两种形式,即无格式输出和有格式输出,分别为和 无格式输出时,只有一个参数,该参数被双引号括起来。程序执行时将按照双引号内的字符串原样显示,即显示第1章 C语言入门有格式输出时,函数printf有两个参
18、数,第一个参数为格式控制字符串,双引号内的字符串将按照顺序输出,但是遇到格式控制符“%d”时,将使用第二个参数,即变量sum中的数据(假设为47)对格式控制符进行替换,从而输出 函数scanf与printf的一般形式分别为其中,变量列表即用逗号分隔的一个或多个变量;而格式控制字符串中,需要有对应数目的格式控制符。注意,函数scanf中变量列表的每一个变量前都需要有地址符号“&”。而函数printf正如前面所述,可以只有一个参数,即省略参数变量列表。第1章 C语言入门1.5 流 程 控 制第1章 C语言入门例1.3中实现了最简单的人机交互,即根据程序的提示和要求通过键盘输入两个整数,然后程序计算
19、出两个整数的和。现在我们希望程序能够根据计算的结果,指出结果是大于0、等于0还是小于0。因此在源程序代码中,需要引入能够根据结果进行判断的语句。【例1.4】编写程序,由键盘输入两个整数,求和并判断结果是大于0还是小于0。第1章 C语言入门程序编译成功后,执行该程序,并根据屏幕提示分别输入第一个整数25和第二个整数-30,如图1.14所示。在程序编译成功而开始执行时,首先提示输入第一个整数,通过键盘输入25后按回车键,将数值25赋给整型变量a;接着程序提示输入第二个整数,通过键盘输入-30后按回车键,将数值-30赋给整型变量b。然后,程序计算变量a与变量b的和并赋值给整型变量sum。到目前为止,
20、程序中的语句按照它们在源代码中的顺序一句一句地被执行。这就是顺序结构。然而在执行求和语句之后,需要根据结果进行判断,不同的结果将显示输出不同的内容。选择结构就是为了完成类似的任务而产生的,在源程序中通过if语句来判断结果并根据结果输出相应的内容。对于例1.4中的if语句:可以理解为,当程序按顺序执行到if语句时,判断变量sum是否大于0,如果成立,则输出“结果大于0”。在例题中,整数a+b的结果为-5,不满足if语句的判断条件,因此程序将不执行紧跟着if的语句,而是执行下一条if语句。同理,若该判断条件也不成立,则程序继续执行下一条判断语句。第1章 C语言入门因为sum的值为-5,小于0,if
21、语句的条件满足,所以程序执行紧跟着该if语句的输出语句,显示“结果小于0”。if语句的出现,为程序的执行增添了多种可能性。在需要进行判断的场合,均可以根据需要使用if语句。图1.15的流程图简单示意了基于判断的选择语句。if语句的一般形式为程序执行到if语句时,首先计算条件判断表达式的结果。如果该条件成立,则执行紧跟着if的语句,否则不执行该语句。如果条件成立,有多个操作语句需要执行,可以使用“”和“”将条件成立时需执行的语句括起来。第1章 C语言入门1.6 函 数第1章 C语言入门如果我们继续将例题的功能复杂化,要求可以判断从键盘输入的两个数据的大小,则根据上一节的内容,我们可以很容易地将例
22、1.4修改为例1.5。【例1.5】由键盘输入两个整数,判断结果是大于0还是小于0,并判断哪个数字较大。在分析题目的要求以及程序时,可以看到程序已经具备了两个基本功能:(1)根据求和结果,输出不同的内容。(2)根据输入数据大小,输出较大的数据。功能的不断增加,使主程序本身的功能变得模糊。如果能够将程序的代码根据功能的不同分别组织起来,程序在阅读及编写上将会变得条理清晰。C语言程序设计的基本单位就是函数,将复杂功能通过函数的形式封装起来,可以重复使用,而通过函数调用语句,就可以完成相应的复杂功能。第1章 C语言入门因此根据例1.5的要求,采用函数调用形式将其改写为例1.6。【例1.6】由键盘输入两
23、个整数,判断结果是大于0还是小于0,并判断哪个数字较大。第1章 C语言入门从程序源代码中可以看到整个程序由三部分组成,我们用结构图简化为图1.16。正如前面所述,主函数main是C语言程序中必不可少的函数,程序从主函数开始执行,一般也在主函数结束运行。通过函数调用的形式将不同的功能模块组合在一起,便于程序代码的编写、阅读以及管理。函数的重复调用,也可以减少重复编写代码的工作量。主函数的起始部分:对程序后面使用到的函数进行了声明,正如前面提到的C语言对变量要求先定义后使用,对函数也有同样的要求。在本例中,因为函数定义在了主函数的后面,而主函数中又需要使用这两个函数,因此在主函数的开始部分,对两个
24、函数进行声明以便在程序中使用。如果两个函数的定义部分写在了主函数之前,则主函数中的声明部分可以省略。第1章 C语言入门编写函数的过程也就是定义函数的过程。函数定义的基本格式为函数的定义包含了函数头和函数体两部分。函数头定义函数的名字和参数。函数体则定义该函数要完成的功能。函数的命名也遵循前面提到的与变量命名一致的规则,即函数名只能由字母、数字、下划线组成,并且首字符只能是字母或下划线。函数的声明则相对要简单,只需要符合下面的格式即可:函数定义与声明的不同是显而易见的。函数的声明有时也称作是函数的原型。函数的定义、函数的声明以及函数的调用三者应一致,否则将导致编译错误。通常一个程序中可以根据需要
25、定义任意多个函数。函数定义出现的次序和位置可以是任意的,并且这些函数可以放在一个源程序文件中,也可以根据功能的不同放在多个源程序文件中。我们前面提到的文件,就将与输入/输出相关的函数整合到了一个文件中。第1章 C语言入门1.7 编 程 风 格第1章 C语言入门所谓编程风格,也称作程序设计风格,是指在程序编写或者设计过程中,遵循一定的规范,从而表现出来的特征。从学习一门程序语言之初就应注重培养良好的编程风格。良好的编程风格,可以使程序结构合理,逻辑清晰。良好的编程风格有助于程序的阅读、理解和维护。编写程序代码时,也需要将程序代码写得错落有致,要注意语句的缩进,不同层次的代码缩进的字符数不同。这样
26、,编写的代码就更清晰和易于阅读。对代码进行注释,是初学者需要注意养成的一个良好的编程习惯。前面的章节中提到注释对代码起到了文档化的作用,帮助对程序进行文字性记录,有助于程序的阅读。解释程序功能的部分要做到“精”、“准”,代码阅读者根据这些注释知道应该对程序作什么样的调整。在不断的练习和代码编写过程中,要逐步地掌握注释的恰如其分,而不是做过多的注释。因此,对于注释的内容需把握以下几点:描述程序的目的、解释程序的功能、提示程序的细节。命名符合一定的规范,是我们形成良好编程风格的一个基本条件。简单地说,就是对程序编写过程中的标识符采取有含义的名字,比如对变量的命名、对函数的命名等,应该能够通过名字很容易地判断出变量所要存储的数据或者类型、函数所要实现的功能,而不是随意采用一个字母或无关的词汇进行命名。代码编写简单化,即Keep It Simple(KIS),是作为初学者应该掌握的一个基本原则。简单的程序容易编写,产生的错误就较少,同时也易于维护。程序代码简单,人们就不必为了读懂它而花费较多的时间和精力。代码编写得简单,不需要动脑就可以看明白,是对该原则的最好描述。