1、从零开始学习C语言本书的主要特点如下: 内容全面详细。本章一共分为18章,涵盖了C语言中的所有知识,并将C语言各个知识点做一个章节进行讲解。并举出大量实例。 结构清晰明了。本章18章中,每章都分若干个小节,每个小节一个小知识点。结构层次清晰可见。 讲解由浅入深。向读者介绍C语言的基本理论知识、数据结构和基本的编程规则,让读者对C语言的基本知识以及结构化程序设计思想有一个初步的认识;接着对C语言一些复杂的数结构类型如数组、函数、指针操作、结构体与共用体、文件等进行详细的讲解。 实例丰富多样。本书所讲的每一个知识点都运用充分的实例进行讲解说明,便于读者掌握。第1章C语言入门基础 C语言作为国际上流
2、行的计算机高级语言,能实现多种功能。为使读者能够对C语言有一个全面的认识,本章在介绍C语言之前,还简单的介绍了很多其他的相关知识。 计算机语言的演变; 数制、数制转换与存储; 程序设计思想算法; C语言的发展简史和特点; 认识C语言程序; Turbo C V2.0的运行环境及基本操作。1.1 计算机语言的演变 机器语言 汇编语言到 高级语言 面向对象或面向问题的高级语言1.1.1 机器语言 机器语言是第一代计算机语言。计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础,所以也称为二进制语言。机器语言指用机器码书写程序,不易被人们识别和读写,所以使用机器语言是十分痛苦的,
3、特别是在程序有错需要修改时,更是如此。而且,由于每台计算机的指令系统往往各不相同,所以在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。但由于计算机能够直接识别程序中的指令,故而运算效率是所有语言中最高的,这种用二进制编写的程序也叫“目标程序”。1.1.2 汇编语言 汇编语言又称符号语言,对机器指令进行简单的符号化,它也是利用计算机所有硬件特性并能直接控制硬件语言。人们为了减轻使用机器语言编程的痛苦,对机器语言进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“ADD”表示加法,“MOV”表示数据传递等等,因此,人们就能理
4、解程序所进行的操作,方便用户对程序进行纠错及维护。1.1.3 高级语言 用高级语言编写的程序称为“源程序”,源程序不能在计算机上直接运行,必须将其翻译成二进制程序后才能执行。翻译有两种方式:解释程序和编译程序。解释程序是将一次只读一行源程序,并执行该行语言指定的操作,每次运行用户程序时,必须要用解释程序。在程序的开发过程中,运用解释的方式执行程序,便于程序员对程序进行调试。编译程序是将源程序全部翻译成目标代码即二进制程序后再执行,只读取一次,节省了大量的时间。1.1.4 面向对象或面向问题的高级语言 第四代语言是使用第二代第三代语言编制而成的。面向对象的语言是在面向过程的计算机语言的基础上发展
5、面来的,如C+语言就是由C语言发展面来的。所谓面向对象,就是基于对象的概念,以对象为中心,类和继承为构造机制,认识了解刻画客观世界以及开发出相应的软件系统。它是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。比较典型代表的面向对蟪绦蛏杓朴镅杂C+、Virtual Basic、Delphi等。1.2 数制、数制转换与存储 数制 数制转换 计算机中数据的存储1.2.1 数制 1二进制数 二进制数由两个基本数字0、1组成,二进制数的运算规律是逢二进一。 例如: 100101可以写成(100101) 2或写成100101B。 二进制数
6、的加法和乘法运算如下: 0+0=0 0+1=1+0=1 1+1=10 0*0=0 0*1=1*0=0 11=1 1011011 0010101 1000110 +1.2.1 数制 2八进制数 八进制是由07八个数字组成,运算规则是逢8进一。 例如: 八进制261写成(261) 8、(261)O。1.2.1 数制 3十进制数 十进制数是我们常用的数据表示方法,由09十个数字组成,运算规则是逢10进一。 例如: 十进制126可表示为(126) 10、126D、126。1.2.1 数制 4十六进制数 十六进制数由09以及AF十六个数字组成,AF分别表示十进制数1015,运算规则是逢16进一。通常在表
7、示进用 例如: (1FA)16、(1FA)H注意 在C语言程序中 十六进制需要以0x开头 八进制需要以0开头, 例如: 0123表示八进制的123 0x123表示十六进制的123 1.2.2 数制的转换 1二进制、八进制、十六进制转换成十进制 规则:数码乘以各自的权的累加 【例1-1】其他进制转换成十进制。 (10001)B=2 4 +2 0 =16+1=17 (101.01)B=2 2 +2 0 +2 -2 =4+1+0.25=5.25 (011)O=8 1 +8 0 =8+1=9 (72)O=7*8 1 +2*8 0 =7*8+2*1=58 (112A)H=1*16 3 +1*16 2 +
8、2*16 1 +10*16 0 43941.2.2 数制的转换 2十进制转换成二进制、八进制、十六进制 规则: 整数部分:除以进制取余数,直到商为0,余数从下到上排列。 小数部分:乘以进制取整数,得到的整数从上到下排列。【例1-2】十进制转换成其他进制。 (1)十进制20.345转换成二进制 20.345D=10100.01011B 整数部分: 20/2=10 -余0 10/2=5 -余0 5/2=2 -余1 2/2=1 -余0 1/2=0 -余1 小数部分: 0.345*2=0.69 -取整数0 0.69*2=1.38 -取整数1 0.38*2=0.76 -取整数0 0.76*2=1.52
9、-取整数1 0.52*2=1.04 -取整数1【例1-2】十进制转换成其他进制。 (2)十进制100转换成八进制、十六进制 100/8=12 -余4 12/8=1 -余4 1/8=0 -余1 100D=144O 100/16=6 -余4 6/16=0 -余6 100D=64H1.2.2 数制的转换 3二进制转换八进制 规则: 整数部分:从右向左按三位进行分组,不足补零。 小数部分:从左向右按三位进行分组,不足补零。 【例1-3】将二进制数(1101101110.110101) 2转换成八进制数。 001101101110.110101 1 5 5 6 6 5 (1101101110.11010
10、1) 2=(1555.65) 81.2.2 数制的转换 4二进制转换成十六进制 规则: 整数部分:从右向左按四位进行分组,不足补零。 小数部分:从左向右按四位进行分组,不足补零。 【例1-4】将二进制数(001101101110.110101) 2转换成十六进制数。 001101101110.11010100 3 6 E D 4 (001101101110.110101) 2=(36.ED4) 161.2.2 数制的转换 5八进制、十六进制转换成二进制 规则: 一位八进制对应三位二进制。 一位十六进制对应四位二进制。 【例1-5】八进制、十六进制转换成二进制。 (136) 8 =(001 01
11、1 110) 2 (17A) 16 =(0001 0111 1010) 2 1 3 6 1 7 A1.2.3 计算机中数据的存储 如表示:比较一下1与-1的原码、反码和补码。1.3 程序设计思想算法 在我们遇到问题的时候,我们首先在大脑中形成一种解题思路,然后再根据可行的思路运用具体的步骤解决问题。在程序设计中,也需要有一种编程思路,这就是算法。1.3.1 算法的概念 在程序设计中,算法应该能够离散成具体的若干个操作步骤,而且每一个步骤都是能够用程序设计语言提供的语句或者语句串来完成的。 例如,求二个整数中的最大的数。解决这个问题的算法如下: 第1步开 始。 第2步输入二个整数a、b。 第3步
12、比 较 a、b的大小,如果ab时,输出a,否则输出b。 第4步结 束。 需要注意的是,程序是有开始和结束的,所以算法必须有“开始”和“结束”这两个步骤。1.3.2 算法的特点 算法具有以下五个重要的特征: 1有穷性 2确定性 3。有效性 4输入 5输出1.3.3 算法的表示方法 1自然语言 【例1-6】用自然语言描述100以内正整数的和。 1设S代表总和,N代表正整数; 2S=0,N=1; 3S=S+N,原来的和加上一个正整数; 4N=N+1,把下一个正整数赋给N; 5判断N是否小于100,如果是跳转到步骤3,否则跳转到步骤6; 6输出S的值。1.3.3 算法的表示方法 2流程图 常用流程图构
13、件1.3.3 算法的表示方法 3伪代码 将上述【例1-6】用伪代码描述表示如下: N1; S0; do while N100 SS+N; NN+1; print S1.3.3 算法的表示方法 4N-S图 (1)顺序结构N-S图 (2)选择结构N-S图 (3)循环结构N-S图1.3.4 算法分析 什么样的算法才是一个好的算法呢?通常从下列几个方面衡量算法的优劣: 1正确性 2可读性 3健壮性 4时间复杂度与空间复杂度 T(n)=O(f(n) S(n)=O(f(n)1.4 C语言的发展简史和特点 C语言能够快速发展成为最受欢迎的语言之一,主要是因为它具有强大的功能。它既有高级语言的特点,又具有汇编
14、语言的特点,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。1.4.1 C语言的诞生与发展 1972年,贝尔实验室D.M.Ritchie设计出C语言,当时Ken Thompson刚刚使用汇编语言和B语言开发出UNIX操作系统,但用汇编语言开发系统非常烦琐,于是D.M.Ritchie用C语言改写UNIX系统的内核。 1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本可移植的C语言编译程序。 1978年由美国电话电报公司(AT 变量定义 scanf( “%d“, /*输入a*/ 格式输入函数与注释 scan
15、f( “%d“, 格式输入函数 sum=a+b; /*对a、b求和*/ 求和与注释 printf(“sum=%d n“,sum); 格式输出函数 程序结束2.1 C语言程序的结构特征 1文件包含 通用的格式是 # include或# include“文件名”它 属于预处理命令中的一种。文件包含的作用是将该程序编译时所需要的文件复制到本文件,再对合并后的文件进行编译。stdio.h是基本输入输出的头文件,在上例中,我们用到输入输出函数printf()、scanf(),因此需要在源程序的开头写上# include。2.1 C语言程序的结构特征 2主函数 main()表示主函数,这是系统提供的特殊函
16、数,每一个C语言程序有且只有一个main()函数。函数的内部用一对大括弧括起来,括起来的部分称为函数体。 # include文件包含 void main()主函数 程序开始 inta ,b ,sum;变量定义 scanf( “%d“, /*输入a*/格式输入函数与注释 scanf( “%d“, 格式输入函数 sum=a+b; /*对a、b求和*/求和与注释 printf(“sum=%d n“,sum);格式输出函数 程序结束2.1 C语言程序的结构特征 3变量的定义 一个变量在内存中占据一定的存储单元,在该存储单元中存放变量的值。本行定义了三个变量a、b、sum,分别用来存储等待输入的两个整型
17、数和他们的和,便于以后的操作。 C语言中,变量的定义必须符合标识符的命名规则,即标识符只能字母(大小可均可)、数字和下划线3种字符组成,第1个字母不能是数字。 C语言对大小写严格区分,变量一般用小写。变量遵循先定义后使用的原则,定义变量有利于系统分配存储空间,定义变量其实就是在内存中开辟存储单元。2.1 C语言程序的结构特征 4格式输入与输出函数 输入函数的作用是将输入设备(如键盘)按指定的格式输入一组数据,赋到指定的变量存储单元,作为变量的值。 输出函数的作用是向系统指定的输出设备(如显示器)输出若干个任意类型的数据。 # include文件包含 void main()主函数 程序开始 in
18、ta ,b ,sum;变量定义 scanf( “%d“, /*输入a*/格式输入函数与注释 scanf( “%d“, 格式输入函数 sum=a+b; /*对a、b求和*/求和与注释 printf(“sum=%d n“,sum);格式输出函数 2.1 C语言程序的结构特征 5注释部分 例子中的行“/*”开头到“*/”结尾之间的内容表示注释,它可以在一行书写或分多行书写,可写在程序的任何位置。 中的注释部分是对所要进行的操作的说明,是一个输出语句,输入变量a的值,是一个赋值语句,将a、b的相加的和赋给sum。2.2 C语言程序的书写风格 为了增强程序的可读性,便于人们理解和查错,建议使用良好的书写
19、格式。#include void main( ) intk=0; char c=A;/*定义一个整型变量,一个字符变量,并赋值*/ do /*直到型循环*/ switch (c+) /* switch 多分支语句*/ case A: k+; break; case B: k-; case C: k+=2; break; case D: k=k%2; break; case E: k=k*10; break; default: k=k/3; k+; while(cG); printf(“k=%dn“, k); 2.2 C语言程序的书写风格 C语言的书写格式,具体如下: 1、C语言程序使用英文小写
20、字母书写。大写字母一般符号常量或特殊用途使用。C语言区分字母大小写,如student和STUDENT是两不同的标识符。 2、标识符是用于标识某个量的符号,可由程序员任意定义,但为了增加程序的可读性,命名应尽量有相应的意义,以便阅读理解以及程序员之间的交流。2.2 C语言程序的书写风格 3、不使用行号,通常按语句的顺序执行。前面的例子中我们使用编号是为了讲解的方便,在正常的源程序中,不能使用。 4、所有语句都必须以分号“; ”结束,作为语句之间的分隔符。 5、C程序中一个语句可以占多行,一行也可以有多个语句,但要用分号分隔开。2.2 C语言程序的书写风格 6、不强制规定语句在一行中的起始位置,但
21、同一结构层次的语句应左对齐。低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写,以便看起来更加清晰,增加程序的可读性。属于同一模块时要用“ ”括起来,如上例中的do-while语句和switch语句。 7、为了使程序更加清晰,可以使用空行,空行不影响程序的执行,但不要在一个语句内加空行。2.2 C语言程序的书写风格 8、C语言中有的符号必须配对使用。如注释符号“/* */”,模块起止符号“ ”,圆括号“() ”等。在输入的时为了避免忘记,可连续输入这些起止符号,然后再在其中进行插入来完成内容的编辑。 9、在源程序中,凡是用“/*”和“*/”括起来的文字都是注释。可以在程序的任何一处插
22、入注释。注释是对程序或其局部的说明,不参加编译也不在目标程序中出现。建议多使用注释信息,可以增加程序的可读性。2.3 C语言程序的开发过程2.3 C语言程序的开发过程2.4 Visual C+集成开发环境 Visual C+ 6.0是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE ),已成为专业程序员进行软件开发的首选工具,是目前非常盛行的一种C编译系统,功能十分强大,操作方便,视图界面友好。2.4.1 熟悉Visual C+ 6.0集成开发环境 1安装Visual C+ 6.0 运行安装文件中的setup.ex
23、e程序,然后按照安装程序的提示信息进行操作,可以指定系统文件存放的路径,但一般不必自己另行指定,采用系统提示的默认方案即可完成安装过程。2.4.1 熟悉Visual C+ 6.0集成开发环境 2启动Visual C+ 6.0 图 Visual C+ 6.0主窗口2.4.2 C语言在Visual C+ 6.0的开发过程 如图2-4所示刚开始进入Visual C+ 6.0的界面时,里面的项目工作区和文本编辑区是空的,要开始一个新程序的开发时,需要通过应用程序向导建立新的工程项目,并在项目中添加文件,然后再进行其它的开发操作。2.4.2 C语言在Visual C+ 6.0的开发过程 1新建工程项目2
24、.4.2 C语言在Visual C+ 6.0的开发过程 2建立项目中的文件2.5 用Visual C+运行一个C程序 在上一节我们熟悉了Visual C+ 6.0集成开发环境,以及在里面的程序开发过程,现在我们来编辑并运行一个简单的C语言程序,来熟悉一下Visual C+ 6.0中的整个上机过程。 1编辑源程序 2编译连接源程序 3运行程序#include void main( ) inta,b,sum; printf(“输入第一个数a:“); scanf( “%d“, /*输入a*/ printf(“输入第一个数b:“);/*输入b*/ scanf( “%d“, sum=a+b;/*对a、b
25、求和*/ printf(“%d和%d的和是%d n“,a,b,sum); 第3章常量、变量与标识符 C语言中的数据包括常量和变量,作为操作对象的数据都是以某种特定的形式存在的,可以用C语言中的标识符来表示一个常量或者一个变量。 标识符; 常量; 变量; 变量的初始化。3.1 标识符 我们已经知道在C语言中,数据在计算内存中存储的,程序设计中用到的数据,要到计算机的内存中读取,因此需要用到一个符号来代表它,这里就是我们所要讲的标识符。 标识符是指用来标识常量名、变量名、函数名、数组等对像,按照一定的命名规则定义的字符序列,即一个代号。3.1.1 标识的命名 标识符的命名规则如下: 标识符由字母(
26、包括大写字母和小写字母)、数字及下划线组成,且第一个字符必须是字母或者下划线。 在C语言中,大写字母和小写字母是有区别的,即作为不同的字母来看待,应引起注意。3.1.2 保留字 保留字也称关键字,是指在高级语言中,那些已经定义过的标识符,用户不能再将这些字作为变量名、常量名、函数名、数组名等。 C语言共有32个关键字,具体可分为4类: 数据类型关键字(12个):char、double、enum、float、int、long、short、signed、struct、union、unsigned 、void。 控制语句关键字(12个):break、case、continue、default、do、
27、else、for、goto、if、return、switch、while。 存储类型关键字(4个):auto、extern、register、static。3.1.2 保留字 其他关键字(4个):const、sizeof、typedef、volatile 。 C语言中除了上述的保留字外,还使用一些具有特定含义的标识符,称为特定字。如include、define、ifdef、ifndef 、endif、line。这些特定标识符主要用在C语言的编译预处理命令中。3.1.2 保留字 在C语言中,标识符的命名除了遵守命名规则、不使用关键字以外还要注意以下几点。 在C语言中,大写字母和小写字母是有区别的
28、,即作为不同的字母来看待,因此Teacher、TEACHER是两个不同的标识符。 在起名时,应注意做到“见名知义”。比如表示姓名:比较好的标识符:Name、name、xing_ming、Xingming、xm等;比较差的标识符:x、y、abc等。 尽量不用单个的“l”和“o”作标识符。这个与数字中的“1”和“0”很相像,程序设计过程中容易混淆。 代数计算时可以采用习惯的名字。如:圆的半径和面积:r,s;立方体的长、宽、高和体积:a、b、h、v。3.2 常量 常量是指在程序运行过程中其值不随程序的运行而改变的量。常量在程序中不需要进行任何说明就可以直接使用,常量本身就隐含了它的类型。常量区分为不
29、同的类型,分为直接常量和符号常量。3.2.1 直接常量 直接常量是直接写出来的,直接常量的书写形式决定了它的类型。直接常量包括整型常量、实型常量、字符型常量和字符串常量。例如: 整型常量:15、-8、0。 实型常量:3.7、-8.2、58.12E-2。 字符常量:a、A、+、5。 字符串常量:“this is a boy.”、“a”、“123”。3.2.2 符号常量 符号常量是指用一个标识符代表一个常量。如商场内某一产品的价格中发生了变化,如果我们在一个程序中多次用到了这种商品的价格,需要逐修改非常麻烦,这样可以定义一个符号常量,在文件的开头写这么一行命令: #define PRICE 50
30、这里用#define命令行定义PRICE代表常量50,后面的程序中有用到这种商品的价格时,直接用PRICE,可以和常量一样进行运算,如果常量的值需要发生变化,只需要在#define命令行进行修改,达到一改全改的目的。3.2.2 符号常量 这里需要说明以下几点: 符号常量名习惯上用大写,以便与变量名相区分。 一个#define对应一个常量,占一行;n个常量时需n个define与之对应,占n行。(这将在第7章的预编译部分进行详细的讲解)。 符号常不同于变量,它的值在其作用域内不能改变,也不能再被赋值。 在程序中使用符号常量具有可读性好,修改方便的优点。3.3 变量 变量是指在程序运行过程中其值可以
31、改变的量。程序中使用的变量名是用户根据需要而取名,变量名必须符号标识符的命名规则。 在C语言中,由于程序的多样性的需要,对变量也有各种各样的要求,比如:变量的生命期,变量的初始状态,变量的有效区域,变量的开辟地和变量的开辟区域的大小等等,为了满足这些要求,C语言设置了以下变量:不同数据类型的变量、全局变量、局部变量、静态变量(静态全局变量和静态局部变量)、寄存器变量、外部变量等。这里我们只要先讲解不同数据类型的变量,在第6章我们将逐一对其他种类的变量进行讲解。3.3.1 变量的定义 变量的定义需要注意以下几点。 每个变量定义语句都必须以分号结尾。 变量定义语句可以出现在变量使用之前的任何位置。
32、程序设计时只要不违背“先定义,后使用”的原则即可。 变量一经定义,每一个变量就有一种确定的类型,在编译时就能为其分配相应的存储单元。 一个变量在内存中占据一定的存储单元,用变量名来标识在内存中所分配的存储单元,在该存储单元中存放变量的值。3.3.2 变量的初始化 变量的初始化就是对变量赋初值。初始化变量并不是必须的,但是在c语言中未初始化的变量是其数据类型允许范围内的任意值(静态变量除外),为了防止运算中出错,一般建议定义变量后,立即初始化。变量的初始化有种方法:一种是定义初始化,即定义变量的同时对其赋予初始值。另一种方法是先定义变量,然后再进行赋值或是等到需要赋值的时候再赋值。3.4 变量的
33、初始化 对于变量的初始化,我们可以归纳以下几点: (1)初始化实际上是一个赋值语句。 (2)在定义变量的时候,可以只给部分变量赋值。 (3)如果同进对几个变量赋相同的初值,应该注意书写格式。3.4 变量的初始化 在C语言中,使用变量时,如果它出现在表达式中,事先必须有一个初始值,否则其值将是一个不确定的值。变量获取初始值有以下几种方法: 赋值语句:“=”在C语言中是赋值符号,运用赋值符号可以对变量进行赋值。 读取语句:在有些程序的值是不确定的需要用户自己输入,因此需要用读取语句从外部的输入。第4章数据类型 C语言具有丰富的数据类型。C语言中的数据类型分为四大类,即基本数据类型、构造类型、指针类
34、型和空类型。本章重点介绍了基本基本数据类型。 C语言中的数据类型; 整型数据; 实数型数据; 字符型数据; 数值型数据间的混合运算。4.1 C语言中的数据类型 所谓数据类型是按被说明量的性质、表示形式、占据的存储空间的多少,构造特点来划分的。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类。 数据的类型不同,它们取值范围、运算属性以及存储方式等会不相同,C语言程序中所用到的数据都必须指明一定的数据类型后才能对数据进行各种操作。4.1.1 基本数据类型 基本数据类型是语言系统定义的数据类型,只能有单一的值,在程序定义变量时可以直接引用。C语言中常用的基本数据类型有整
35、型、实型、字符型。如在填写人的年龄时,使用的整型数据;学生的分数要用实型类型;学生姓名是由多个字符组成的。4.1.2 构造数据类型 构造数据类型是由基本数据类型按一定的规则组合而成的,因此也称为导出类型数据。数组是由相同类型的数据组合而成的,如一班学生的数学成绩组合在一起,就是一个实数型数组。结构体是由不同类型的数据组合而成的,比如统记一个学生的信息包括学号(长整型)、学生姓名(字符型)、性别(字符型)、年龄(整型)等,所有的数据组合在一起就成了构造体。如果若干个数据不同时使用时,为了节省内存空间,我们就可以让它们占用相同的内存区域,这些数据组合起来就是共用体,它可以是同类型的数据,也可以不同
36、类型的数据。4.1.3 指针数据类型 指针是一种特殊的数据类型,是C语言的核心,也是C 语言点所在,同时又是具有重要作用的数据类型,其值用来表示某个量在内存储器中的地址。在本书的第14章我们将会重点给予讲解。4.1.4 空类型 空类型是从语法完整性的角度给出的一处数据类型,表示不需要具全的数据值,因此也就没有数据类型。空类型在调用函数值时,通常应向调用者返回一个函数值,这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”,其类型说明符为void。4.2 整型数据 整型数据分为一般整型、短整型
37、和长整型,并且每一种类型又分为带符号和无符号两种类型。4.2.1 整型常量 整型常量的数据类型是整数,包括正整数、负整数和零。在C语言中,整型常量有以下三种不同的数制表示形式: 十进制整数常量:这种表示方法就是我们平时所熟悉的表示方法,以数字09构成,最高位也是就左边第一位不能为0。例如,-39,0,171等 八进制整型常量:以数字0开头,其后再写上要表示的八进制数。八进制数各位由07这八个数字之一组成。例如0134,0471,-072。 十六进制整型常量:以0X或0x,其后再写上要表示的十六进制数。十六进制各位由数字09或字母af或AF构成。如0x17,0XCF,-0X1f等。4.2.2 整
38、型变量 整型变量是指其值为整型数据的变量。整型数据有三种即整型(int)、短整型(short int)和长整型(long int)。为了方便书写,我们将short int和long int后面的int省略,分别用short和long来表示短整型和长整型。 1整型变量的定义 整型变量分为整型变量、短整型变量、长整型变量。 inta; /*定义一个整型变量a*/ short d=16; /*定义一个短整型变量d*/ long s; /*定义一个长整型变量s*/ signed inta; /*定义一个带符整型变量a*/ unsigned int num; /*定义一个无符号整型变量num*/ 【例4
39、-1】整型数据简单运算。数据的溢出 【例4-2】整型数据的溢出。 #include void main() short a,b,c,d; a=32767; b=a+1; c=-32768; d=c-1; printf(“%dn%dn%dn%dn“,a,b,c,d); 4.3 实数型数据 实型数据表示的实际上就是带小数的数值,又称为浮点型数据。实型数据在单精度实型(float)、双精度实型(double)和长双精度实型三种,长双精度实型数据一般情况下很少用到。它们表示数值的方法是一样的,区别在于数据的精度、取值范围以及在内存中占用的存储空间有所不同。如表所示:4.3.1 实数型常量 实型常量有两
40、种表示形式: 1小数表示法 C语言中实数只能使用十进制小数表示,不能用八进制或十六进制表示。这种形式由符号、整数部分、小数部分和小数部分级成,其格式如下: 整数部分小数部分4.3.1 实数型常量 2指数表示法 用指数形式表示特别大或特别小的数值。指数形式的实数由尾数部分、字母E或e和指数部分组成。其格式如下: 尾数部分E(e)指数部分 指数形式的表示方法实际等价于: 尾数部分*10 指数部分 因此,12.3e3等价于12.3*10 3 ,0.12E+5等价于0.12*10 5 。 10023.45可以表示为0.1002345e+5、1.002345e+4、10.02345e+3等,其中只有1.
41、002345e+4才是规范化的指数形式。4.3.1 实数型常量 需要说明以下几点: 实型常量的类型都是双精度浮点型。 实数在计算机中只能近似表示,运算中也会产生误差。 小数部分和指数部分具体有多少位,没有具体的标准,不同的编译系统有不同的规定。小数部分越多,精确度越高;指数部分越多,数值的范围就越大。4.3.2 实数型变量 在程序运行过程中可以改变其值的实型量被称为实型变量。实型变量分为单精度(float)、双精度(double)和长双精度三种类型。在定义实型变量时用以下的方式: float x; /*定义float型变量x*/ double y; /*定义double型变量y*/ long
42、double z, /*定义long double型变量z*/ 【例4-3】测试单精度实型的有效位数。4.3 字符型数据 字符型数据指的是由字母、符号和不用于算术操作的数字组成,又称为非数值型数据。字符型数据分为字符型(char)、带符号字符型(signed char)和无符号字符(unsigned char)。4.3.1 字符型常量 字符型常量包括由一对单引号括起来的一个字符构成的一般字符常量和由反斜杠()开头的特定的字符序列构成的转义字符。 1一般字符常量 字符型常量是由一对单引号括起来的一个字符。这个字符是ASCII字符集中的字符,字符常量的值为该字符的ASCII值。例如: A、x、D、
43、 ?、3、X2转义字符 转义字符是指由反斜杠()开头的特定的字符序列。C语言允许使用这种特殊形式的字符常量,因为在程序设计过程中,有一些字符如回车符、退格符、制表符等控制符号,不能在屏幕上显示,也不能从键盘上输入,只有用转义字符来表示。 【例4-4】转义字符应用举例。4.3.2 字符型变量 字符型变量就是用一个标识符表示字符型数据,并且该标识符的值可以发生变化。字符变量只能存放一个字符。 1字符型变量的定义与存储 字符型变量就是值为字符常量的变量。字符变量只能存放一个字符。 字符型变量的定义与整型变量、实型变量的定义相同,如下: char c1,ch1; 例如: char ch; ch=a;
44、【例4-5】字符型数据的输出 【例4-6】字符型数据的运算。4.4 数值型数据间的混合运算 C语言中,一般情况下相同类型的数据可直接进行运算,运算的结果就是这种类型。例如: 5.0/2.0:参加运算的两个数都是实型,结果为实型2.5 。 5/2:参加运算的两个数都是整型,结果为整型2。4.4.1 自动类型转换 自动类型转换是由系统自动完成的,又称为隐式转换。不同类型的数值进行运算时,系统会自动将级别低的类型转换成级别高的类型,然后再进行运算,运算结果与其中级别高的操作数的类型相同。4.4.2 强制类型转换 强制类型转换是利用强制类型转换运算符将安然将数据类型转换成所需要的类型。强制类型转换符是
45、由一对圆括号将某个类型名括起来构成的。 强制类型转换的语法格式为: (类型名)表达式 (double)a/*将变量a转换成double型*/ (int)(x+y)/*将x与y的和转换成整型*/ (int)x+y/*先将x转换成整型,然后再与y求和*/ 【例4-7】求一个浮点数的个位数字。 【例4-8】强制类型转换示例数据类型之间的转换 (1)实型之间的转换 (2)整型与实型之间的转换 (3)字符型与实型之间的转换 (4)整型之间的转换 (5)有符号数向无符号数转换时第5章运算符及其表达式 运算符是指用来对运算对象进行各种运算的操作符号。表达式是指由多个运算对象和运算符组合在一起的合法算式。其中
46、运算对象包括常数、常量、变量和函数。本章内容如下: 算术运算符及算术表达式; 赋值运算符及赋值表达式; 关系运算符及关系表达式; 逻辑运算符及逻辑表达式; 条件运算符及条件表达式; 逗号运算符及逗号表达式; 位运算符。5.1 算术运算符及算术表达式 算术运算符包括基本算术运算符和自增、自减运算符。基本算术运算符是对数值型也包括字符型数据进行加、减、剩、除的四则运算。5.1.1 算术运算符 算术运算符的具体运用原则 : +(正)、-(负)运算符是属于同一级别的单目运算符,结合方向是自右向左。 +(加)、-(减)运算符是属于同一级别的双目运算符,结合方向是自左向右。例如a+b-c+d *,/,%是
47、同一级别的双目运算符,结合方向是自左向右。例如:a+b*c,运算顺序是先计算b与c的乘积,然后再与a求和,即a+(b*c)。算术运算符注意以下几点: /(除法运算符)的除数不能为0,即不能用一个数去除以0。 *(乘号运算符)在式子中不能省略,也不能写成是代数式子中的乘号“”或“”。例如:求长方体的体积公式为abc,在编程时要写成:a*b*c。 如果两个整型数相除,得到整型结果。如果两个实数相除或其中有一个是实数,那么得到结果为实型。例如: 5/3=1,2/4=0,5/-3=1,5./3=1.666667,5.0/3.0=1.666667 %求余运算符(或称求模运算),只适合于整型数据和字符型数据。求余运算的结果符号与被除数相同,其值等于两数相除后的余数。 5%3 /* 值为2 */ -7%-3 /* 值为-1 */