C语言程序设计新编教程(第2版)(微课版)第1章初识C语言第1章初识C语言
【内容概述】
C语言是目前最优秀的程序设计语言之一,它集高级语言和低级语言的功能于一体,既可用于系统软件的开发,也可用于应用软件的开发,同时它还具有高效、可移植性好等特点。本章主要介绍C语言的结构特点、程序组成、书写规则、上机运行过程和调试应用程序的方法。
【学习目标】
通过本章的学习,理解C语言程序的构成、C语言的词法规定和书写规范,掌握C语言程序的上机步骤和C语言程序的运行环境。
1.1程序设计语言
我们目前使用的计算机应用系统,如网上购物系统、办公系统、排版系统等,都是由计算机程序设计语言编写而成的。计算机程序设计语言通常程序设计语言简称为编程语言,是一组用来定义计算机程序的语法规则。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
1. 程序设计语言的构成
语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言有3方面的因素,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成语言的各个记号之间的组合规律,但不涉及这些记号的特定含义,也不涉及使用者;语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但不涉及使用者;语用表示程序与使用者的关系。
2. 程序设计语言的发展
(1) 机器语言。最初程序员使用的程序设计语言是一种用二进制代码“0”和“1”形式表示的、能被计算机直接识别和执行的语言,称为机器语言。它是一种低级语言,用机器语言编写的程序不便于记忆、阅读和书写。通常不用机器语言直接编写程序。
(2) 汇编语言。在机器语言的基础上设计出了汇编语言,它可以将机器语言用便于人们记忆和阅读的助记符表示,如ADD、SUB、MOV等。计算机运行汇编语言程序时,首先将用助记符写成的源程序转换成机器语言程序才能运行。汇编语言适用于编写直接控制机器操作的底层程序,它与机器密切相关,汇编语言和机器语言都是面向机器的程序设计语言,称为低级语言。
(3) 高级语言。随着计算机应用的发展,出现了高级程序设计语言。它是一种与硬件结构及指令系统无关,表达方式比较接近自然和数学表达式的计算机程序设计语言。
C语言是一种具有很高灵活性的高级程序设计语言。1972至1973年间,贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言,后来C语言又做了多次改进。早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了20世纪80年代,C语言开始进入其他操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用,成为当代最优秀的程序设计语言之一。
3. C语言的特点
(1) C语言简洁、紧凑,使用方便、灵活。只有32个关键字、9种控制语句,程序书写自由,主要用小写字母表示。
(2) 运算符丰富。共有34种。C语言把括号、赋值、逗号等都作为运算符处理,从而使C语言的运算类型极为丰富,可以实现其他高级语言难以实现的运算。
(3) 数据结构类型丰富。
(4) 具有结构化的控制语句。
(5) 语法限制不太严格,程序设计自由度大。
(6) C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能。
(7) 生成目标代码质量高,程序执行效率高。
(8) 与汇编语言相比,用C语言写的程序可移植性好。
但是,C语言对程序员要求也高,程序员用C语言写程序会感到限制少、灵活性大、功能强,但较其他高级语言在学习上要困难一些。
1.2简单的C语言程序介绍1.2.1简单的C语言程序实例用C语言语句编写的程序称为C语言程序或C语言源程序。下面先介绍两个简单的C语言程序,从中分析C语言程序的特性。
【例1.1】用C语言编写一个程序,输出“你好,我的朋友!”。
程序代码: /ex1_1.c: 输出欢迎词/
#include <stdio.h>
int main() /定义主函数/
{
printf("你好,我的朋友!\\n"); /输出你好,我的朋友!/
}程序运行结果如图1.1所示。
图1.1例1.1的程序运行结果
简单的C语言程序介绍

程序说明:
(1) 程序中的main()代表一个函数,其中main是函数名,int表示该函数的返回值类型。main()是一个C语言程序中的主函数,程序从主函数开始执行。一个C语言程序有且仅有一个主函数。一个C语言的程序可以包含多个文件,每个文件又可以包含多个函数。函数之间是相互平行、相互独立的。执行程序时,系统先从主函数开始运行,其他函数只能被主函数调用或被主函数调用的函数所调用。
(2)  函数体用{}括起来。main()函数中的所有操作语句都在这一对{}中间。即main()函数中的所有操作都在main()函数的函数体中。
(3) #include <stdio.h>是一条编译预处理命令,声明该程序要使用stdio.h文件中的内容。stdio.h文件中包含了输入函数scanf()和输出函数printf()的定义。编译时系统将头文件stdio.h中的内容嵌入到程序中该命令位置。C语言中编译预处理命令都以“#”开头。
C语言提供了3类编译预处理命令: 宏定义命令、文件包含命令和条件编译命令。例1.1中出现的#include <stdio.h>是文件包含命令,其中尖括号内是被包含的文件名。
(4) printf()函数是一个由系统定义的标准函数,可在程序中直接调用。printf()函数的功能是将要输出的内容输出到显示器上,双引号中的内容要原样输出。“\\n”是换行符,即在输出完“你好,我的朋友!”后回车换行。
(5) 每条语句用“;”号结束。
(6) /……/括起来的一部分是一段注释。“/”是注释的开始符号,“/”是注释的结束符号,必须成对使用。
【例1.2】输入两个正整数,计算并输出两数的和。
程序代码: /ex1_2.c: 求两个正整数的和/
#include <stdio.h>
int main() //主函数
{
int a,b,num;//定义三个整型变量
printf("请输入两个正整数!\\n");
scanf("%d",&a);//输入数据给变量a
scanf("%d",&b);//输入数据给变量b
num=a+b;//变量a和变量b的值相加,然后将结果赋给变量num
printf("相加结果是%d\\n",num);//输出变量num的值
}程序运行结果如图1.2所示。
图1.2例1.2的程序运行结果
程序说明:
(1) “int a,b,num;”是变量声明。声明了3个整数变量a、b、num。C语言的变量必须先声明后使用。
(2)  程序中的scanf是输入函数的名字,程序中scanf()函数的作用是输入a、b的值。&a和&b中的&的含义是取地址,此scanf()函数的作用是将两个数值分别输入到变量a和b的地址所标识的单元中,也就是输入给变量a和b。
(3) “num=a+b;”是将a、b两变量的内容相加,然后将结果赋值给整型变量num。
(4) “printf("相加结果是%d \\n",num);”是调用库函数printf()输出num的结果。“%d”为格式控制,表示num的值以十进制整数的形式输出。
(5)  “//”之后的内容是注释语句,作用同“/……/”。两种注释语句的区别是: “//”后面的注释语句只能在一行中,不能跨行;若注释语句太长,需要占多行,则每行注释之前均需“//”符号。“/……/”中的注释语句内容可跨行,无须每行均写“/……/”。
1.2.2C语言程序的构成和书写规则1. C语言程序的构成(1)  C语言程序是由函数构成的,函数是C语言程序的基本单位。一个源程序至少包含一个main()函数,即主函数;可以包含若干个其他函数。被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编写的函数。
(2)  main()函数是每个程序执行的起始点,一个C语言程序不管有多少个文件,有且只能有一个main()函数。一个C语言程序总是从main()函数开始执行,而不管main()函数在程序中处于什么位置。可以将main()函数放在整个程序的最前面,也可以放在整个程序的最后面,或者放在其他函数之间。
(3)  源程序可以有预处理命令(include是其中一种),预处理命令通常放在源文件或源程序的最前面。
(4)  每个语句都必须以分号结尾,但预处理命令、函数头和花括号“}”之后不加分号。
(5)  标识符和关键字之间至少加一个空格以示间隔,空格的数目不限。
(6)  源程序中需要解释和说明的部分可用“/……/”或“//”加以注释。注释是给程序阅读者看的,机器在编译和执行程序时,注释将被忽略。
2. C语言程序的书写规则
(1) 在C语言中,虽然一行可写多个语句,一个语句也可占多行,但是为了便于阅读,建议一行只写一个语句。
(2) 应该采用缩进格式书写程序,以便于增强层次感、可读性和清晰性。低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。
(3) 用{}括起来的部分通常表示程序的某一层次结构。
(4) 为便于程序的阅读和理解,在程序代码中应加上必要的注释。
1.3C语言的字符集和词汇1.3.1C语言的字符集程序是由命令、变量、表达式等构成的语句集合,而命令、变量等是由字符组成的,字符是组成语言的最基本的元素。任何一种语言都有其特定意义的字符集,C语言字符集由字母、数字、空格、标点和特殊字符组成。在字符常量、字符串常量和注释中还可以使用汉字或其他可表示的图形符号。
C语言的字符
集和词汇1. 字母
小写字母为a~z,大写字母为A~Z,均为26个。
2. 数字
数字为0~9,共10个。
3. 空白符
空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其他地方出现时,空白符只起间隔作用,编译程序对它们忽略不计。因此,在程序中是否使用空白符对程序的编译不产生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。
 4. 标点和特殊字符
标点和特殊字符包括“+、-、、/”等运算符,“_、&、#、!”等特殊字符,以及逗号、圆点、花括号等常用标点符号和括号。
1.3.2C语言的词汇
在字符集的基础上,C语言允许使用相关的词汇,以实现程序中的不同职能。在C语言中常使用的词汇包括标识符、关键字、运算符、分隔符、常量。
1. 标识符
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C语言规定,标识符只能是字母(A~Z、a~z)、数字(0~9)、下画线(_)组成的字符串,并且其第一个字符必须是字母或下画线。
以下标识符是合法的。
a,b,aa1,b2,a_b,a_1,HE,HE_1 
以下标识符是非法的。
 1a以数字开头。
 H$E出现非法字符$。
 -1a以减号开头。
 a-b出现非法字符-(减号)。
提示: 在使用标识符时还必须注意以下几点。
(1) 标准C语言不限制标识符的长度,但它受各种版本的C 语言编译系统限制,同时也受到具体机器的限制。例如在某版本C语言中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2) 在标识符中,大小写是有区别的。例如,aa和AA 是两个不同的标识符。
(3) 标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于阅读理解,应做到“顾名思义”。
2. 关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类。
(1) 类型说明符。用于定义、说明变量、函数或其他数据结构的类型。如前面例题中用到的int、double等。
(2) 语句定义符。用于表示一个语句的功能。如以后要经常用到的ifelse就是条件语句的语句定义符。
(3) 预处理命令字。用于表示一个预处理命令。如前面示例中用到的include。
3. 运算符
C语言中含有相当丰富的运算符。运算符与变量、函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。
4. 分隔符
在C语言中采用的分隔符有逗号和空格两种。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,用作间隔符。在关键字、标识符之间必须要有一个以上的空格符作间隔,否则将会出现语法错误,例如把“int a;”写成“inta;”,C语言编译器会把inta当成一个标识符处理,其结果必然出错。
5. 常量
C语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种,在后面章节中将专门给予介绍。
1.4C语言的运行环境1.4.1C语言程序的实现过程本章所列举的2个实例是已经编写好的符合C语言语法要求的程序叫作源程序。一个C语言源程序从编写到最终实现结果,需要经过编辑、编译、连接和运行四个过程,如图1.3所示。
图1.3C语言程序的实现过程
C语言的运行环境

1. 编辑
对于一种计算机编程语言来说,编辑是在一定的编程工具环境下进行程序的输入和修改的过程。在编程工具提供的环境下,经过用某种计算机程序设计语言编写的程序,保存后生成源程序文件。C语言源程序也可以使用计算机所提供的各种编辑器进行编辑,比如作为通用编辑工具的记事本、专业编辑工具Turbo C和 Visual C++等。C语言源程序在Visual C++环境下默认的文件扩展名为“.cpp”,在Turbo C 2.0环境下默认的文件扩展名为“.c”。本书使用的实例都是在VC++环境下编辑和实现的。
2. 编译
编辑好的源程序不能直接被计算机所理解,源程序必须经过编译,生成计算机能够识别的机器代码。通过编译器将C语言源程序转换成二进制机器代码的过程称为编译,这些二进制机器代码称为目标程序,其扩展名为“.obj”。
编译阶段要进行词法分析和语法分析,又称源程序分析。这一阶段主要是分析程序的语法结构,检查C语言源程序的语法错误。如果分析过程中发现有不符合要求的语法,就会及时报告给用户,将错误类型显示在屏幕上。
3. 连接
编译后生成的目标代码还不能直接在计算机上运行,其主要原因是编译器对每个源程序文件分别进行编译。如果一个程序有多个源程序文件,编译后这些源程序文件还分布在不同的地方,因此,需要把它们连接在一起,生成可以在计算机上运行的可执行文件。在源程序中,输入/输出等标准函数不是用户自己编写的,而是直接调用系统库函数库中的库函数,因此,必须把目标程序与库函数进行连接。
连接工作一般由编译系统中的连接程序来完成,连接程序将由编译器生成的目标代码文件和库中的某些文件连接在一起,生成一个可执行文件。可执行文件的默认扩展名为“.exe”。
4. 运行
一个C语言源程序经过编译和连接后生成了可执行文件,可以在Windows环境下直接双击该文件运行程序,也可以在Visual C++的集成开发环境下运行。
程序运行后,将在屏幕上显示运行结果或提示用户输入数据的信息,用户可以根据运行结果来判断程序是否有算法错误。在生成可执行文件之前,一定要保证编译和连接不出现错误和警告,这样才能正常运行。因为程序中有些警告虽然不影响生成可执行文件,但有可能导致错误结果。
1.4.2熟悉Visual Studio 2019编程工具
Visual Studio 2019是目前被广泛使用的可视化C++编程工具,同时也是良好的C语言编程工具。在Visual Studio 2019编程环境下,需要首先建立工程,才能建立、编辑和执行程序,存储的C语言源代码文件的扩展名是.cpp。如果在创建文件前没有创建相关工程,系统在编译时会提示是否要创建活动工程。本小节将主要介绍利用编程工具编辑和执行C语言程序的基本方法和步骤。
1. C语言程序的建立
在Visual Studio 2019编程环境中,要想建立和执行C语言程序文件,首先启动编程工具,建立一个工程,之后才能建立C语言文件,具体的步骤如下。
(1) 启动Visual Studio 2019编程工具,选择“开始”→“所有程序”→Microsoft Visual Studio 2019命令,可启动Microsoft Visual Studio 2019的集成开发环境,如图1.4所示。
图1.4Visual Studio 2019编程环境(2) 建立工程。建立工程是建立C语言程序的起始步骤。现在以在“C:\\c_study”文件夹下建立ex1_1工程为例,介绍建立工程的方法。
在Visual Studio 2019编程环境下选择“文件”→“新建项目”命令,打开“新建”对话框,选择“空项目”,单击“下一步”按钮,在“配置新项目”对话框中将项目设置为ex1_1,指定新建工程的路径为“C:\\c_study\\”,创建新工程后的效果如图1.5所示。
图1.5新建工程
(3) 建立C语言程序。工程创建完之后,就可以在此工程下建立C语言程序,具体步骤如下。
① 选择“添加”→“新建项”命令,会弹出“添加新项ex1_1”对话框,如图1.6所示。在该对话框中选择“C++文件(.cpp)”,然后在“名称”文本框中输入“test.cpp”。
图1.6“添加新项ex1_1”对话框
②  单击“添加”按钮,会显示程序编辑界面,输入C语言程序代码,如图1.7所示。
图1.7编辑代码
③ 选择“文件”→“保存”命令,将文件保存。
2. C语言程序的运行
编辑好程序之后,接下来的操作就是要编译和执行程序。在编译之前,应该检查并避免程序代码的错误(当然,在编译的时候系统也会检查出程序中的错误)。值得注意的是,在Visual Studio 2019编写C语言程序,当使用输出语句时,“#include <stdio.h>”命令是不能缺少的,这一点与Turbo C环境是不同的。
选择“调试”→“开始调试”命令(也可以直接按Ctrl+F5组合键),调试并运行程序,如图1.8所示。
图1.8调试程序
程序运行后,会看到程序的运行结果,如图1.9所示。
图1.9程序的运行结果