1、,C语言是一种优秀的结构化程序设计语言,它结构严谨、数据类型完整、语句简练灵活、运算符丰富。自从编写UNIX操作系统获得成功以来,一直受到计算机业内人士的好评。即使在面向对象的语言广泛使用的今天,C语言仍然是高校计算机专业的一门专业基础课。几乎每一所高校都开设C语言这门课,然而,真正易教易学的教材却不多。这是笔者在浙江大学教授近100轮次的C语言教学课后的深刻体会。目前大多数C语言教材先讲授数组,本课程快结束时才讲指针,很多学生对指针的概念感到难以理解,对于它的灵话应用更是困难,即使在浙江大学学习此课程的学生也普遍感到巨大的压力,开设C语言程序设计,但没有掌握C语言的精华部分。从1996年开始
2、,笔者根据多年的教学经验,尝试在第一章就讲授指针与数组,把数组和指针有机地结合起来,并且全书贯穿指针与数组的概念,使学生一开始就对C语言有总体上的清晰认识,这种方法在后来的教学中取得了很大的成功,从心理学的角度来看这也是完全符合人类的心理学习规律。我们不敢说哪种方法最好,但必须尝试一种教学方法,不仅符合此课程的教学特点,使学生学习感到轻松,更符合人们学习的心理学习规律,花更少的时间,能更好地掌握知识,希望这本书能让广大师生达到此目的。尽管笔者修改再三,但无论书的结构还是书的内容都难免有不足的地方,真切地希望欢迎广大师生批评指正,以便在一下版中订正。,前 言,back,1.本软件用PowerPo
3、int制作而成,播放亦在其状态下进行,为了更好地使用该软件,使用者需掌握PowerPoint的基本操作原理和方法。.本软件中的程序部分的运行是通过运行.exe文件和播放.avi文件实现的。因此在使用本软件前,必须在计算机上装上CamtasiaStudio录制器 Microsoft Visual studio C+应用程序。 .本软件内容完整,自成体系,对于使用者的不同情况,用本软件授课时,可补充所需内容,链入其它媒体信息,或同其它软件(如CS ChemDraw等)共同使用,以达到多媒体辅助教学的良好效果。.多媒体教学信息量大,传递速度快,用本软件授课时,应熟悉播放程序,注意控制播放速度,要使观
4、看者有充足的思考时间。,注意事项,back,本书根据C语言的特点,力求突出系统性、完整性、实用性。概念清晰、简明易懂,由浅入深地讲授C语言的基本概念及编程特点,全书贯穿C语言的精华部分指针、数组、函数,使教材的整个体系融为一体。 本书共7章:第1章 C程序设计基础,第2章 程序的控制结构,第3章 函数,第4章 指针与数组,第5章 指针与函数,第6章 结构体与共用体,第7章 文件。 本书内容精炼,结构合理,对学习中可能遇到的难点作了系统、详尽的分析,极大地减轻了学习C语言的困难。本书不仅适合于高等职业院校计算机系的教材,也是各类本科院校、专科院校学生学习C语言程序设计的良师益友,是一本提高程序设
5、计能力的优秀教材。,内 容 简 介,back,章目录,第1章 C程序设计基础第2章 程序的控制结构 第3章 函数 第4章 指针与数组 第5章 指针与函数 第6章 结构体与共用体 第7章 文件,目录,u 本章重点 1C语言程序的结构。 2变量与常量的表示方法。 3运算符与表达式。 4指针的概念及变量地址与指针的关系。 5数组的概念。 6指针对数组元素的引用方法。 u 本章难点 1C语言中常量的表示方法。 2整型数在计算机中存储的形式。 3不同类型数据的转换。 4转义字符。 5各种运算符与表达式的正确理解。 6指针的概念及指针的移动。 7数组的概念及数组的赋值。,第1章 C程序设计基础,第一章 ,
6、节目录,u 本章重点 1if语句和用if语句构成的选择结构。 2if语句的嵌套。 3switch语句。 4while循环。 5dowhile循环。 6for循环。 7循环的嵌套。,u 本章难点 1if语句中的条件表达式的理 解。 2if与else的配对问题。 3switch语句的程序流向。 4while、dowhile、for循环的特点。 5for循环中的执行过程及for循环的变化形式。 6循环嵌套中的执行过程。,第2章 程序的控制结构,第二章 ,节目录,u 本章重点 1函数定义的格式。 2函数的调用方法。 3函数调用中的参数传递方法。 4函数的递归调用。 5变量在函数中的作用域与生存期。 u
7、 本章难点 1函数原型的理解。 2函数调用中的实际参数与函数定义中函数形参在形式上的区别。 3函数调用中参数的传递方法。 4递归算法。 5变量的存储类型对变量在函数中的作用域与生存期的影响。 6多模块编程中的外部变量的使用。,第3章 函数,第三章 ,节目录,u 本章重点 1. 指针变量对一维数组元素的引用方法。 2. 指针在一维数组中的应用。 3. 指针变量对字符串的引用。 4. 数组指针在二维数组中的应用 5. 指针数组的概念。 6. 多级指针概念与应用。 u 本章难点 1. 如何用指针变量来表示数组元素及元素的地址。 2. 指针变量在一维数组中的移动。 3. 字符指针变量的赋值方法及运用。
8、 4. 数组指针的理解与应用。 5. 数组指针与指针数组的区别。 6. 对多级指针概念的理解。,第4章 指针与数组,第四章 ,节目录,u 本章重点 1. 函数指针的概念、定义及赋值。 2. 函数指针的应用。 3. 指针函数的定义。 4. 命令行参数的应用。 u 本章难点 1. 函数指针的概念,函数指针的赋值及调用方法。尤其是定义及调用中的形式参数及实际参数的使用。 2. 指针函数的概念以及与函数指针的区别。 3. 命令行参数编程中的文件名与命令的关系。 4. 命令行参数的赋值方法。,第五章 ,第5章 指针与函数,节目录,u 本章重点 1. 结构体类型的定义及结构体变量的定义。 2. 结构体变量
9、占用的内存空间。 3. 结构体变量对结构体成员的引用方法。 4. 结构体指针变量对结构体变量、结构体数组的应用。 5. 结构体变量作为函数的参数。 6. 共用体的应用。 u 本章难点 1. 正确理解结构体类型与结构体变量的关系。 2. 结构体数组变量对结构体成员的引用,指向结构体变量的指针对结构体成员的不同引用方法。 3. 结构体变量的输入输出。 4. 结构体变量作为函数的参数。 5. 结构体、共用体的嵌套。,第六章 ,第6章 结构体与共用体,节目录,u 本章重点 1. 文件的概念与文件的作用。 2. 文件的读写。 3. 文件的打开与关闭。 4. 文件结束的判断方法。 5. 文件操作中常用的函
10、数:fputc、fgetc、fscanf、fprintf、fread、fwrite。 u 本章难点 1. 文件指针的概念。 2. 文件读写的概念。 3. 文件结束的判定。 4. 文件操作中常用函数的应用。,第七章 ,第7章 文件,节目录,第一章 C程序设计基础,返 回,第1章 C程序设计基础,程序是指人们将需要计算机做的工作写成一定形式的指令,并把它们存储在计算机的内部存储器中。当人们给出命令之后,它就按指令操作顺序自动进行,我们把这种可以连续执行的一条条指令的集合称为“程序”。,结构化程序设计由三种结构组成:顺序结构、选择结构、循环结构。,程序的设计过程如图 (点击进入),节目录,1.1 C
11、程序的结构,1.1.1 程序的概念,由高级语言编写的程序称为“源程序” 。,程序间的关系:,由二进制代码表示的程序称为“目标程序”,由二进制代码表示的程序称为“目标程序”,把源程序转换成机器能够接受的目标程序,软件工作者编制了一系列软件,通过这些软件可以把用户按规定语法写出的语句一一翻译成二进制的机器指令。这种具有翻译功能的软件称为“编译程序”。,节目录,11,程序设计过程,节目录,1.1.2 C程序的构成,C语言源程序可由一个或一个以上文件组成,而每个文件至少有一个函 数,函数是C语言的最基本的单位。C程序中必须有且只能有一个main的函数。程序运行时从main函数开始,最后回到main函数
12、。,C程序中书写格式自由,一行内可写几个语句,但区分大小写字母。用C语言写成的函数结构图所示。,节目录,C函数由语句构成,语句结束符用“;”表示,语句由关键字、标识符、运算符和表达式构成。其中“”和“”分别表示函数执行的起点与终点或程序块的起点与终点。,C语言程序可由表达式、系统函数及自定义函数组成,程序可以很复杂,也可以很简单,但即使很简单的程序也应由main()及“”、“”组成 。,节目录,1.2 最简单的C程序,在C语言中,printf为格式输出函数,它是C语言的库函数。包含在stdio.h库中,因而凡是用到printf函数都要包含函数库stdio.h。在此函数中,除了格式控制符外,其他
13、字符原样输出,因而此程序的运行结果为:Hello,world。下面我们将用一些例子来说明此函数的应用。,include int add(int x,int y) int z; z=x+y; return z; void main( ) int a=1,b=2,z; /* 变量的定义*/ z=add(a,b); /* 函数调用 */ printf(“%d+%d=%dn“,a,b,z); /* %d为格式控制符,表示以整数形式输出结果 */ ,1.1 下面是一个函数结构的例子:,有关注释的说明,节目录,例.,例.3,例.4,例.5,例.6,C语言程序可由表达式、系统函数及自定义函数组成,程序可以很
14、复杂,也可以很简单,但即使很简单的程序也应由main()及“”、“”组成 此程序没有什么意义,执行后什么也没做,可以认为是最简单的C程序了。,例1.2 最简单的C程序,/*最简单的C程序*/ #include void main( ) ; ,例.3,例.4,例.5,例.6,例. ,例1.3 字符串的输出。,/*功能 打印字符,在屏幕上输出:Hello,world */ #include void main() printf(“Hello,worldn“); /*n为换行符*/ ,说明: 在C语言中,printf为格式输出函数,它是C语言的库函数。包含在stdio.h中,因而凡是用到printf
15、函数都要包含函数库stdio.h。在此函数中,除了格式控制符外,其字符原样输出,因而此程序的运行结为:Hello,world。,例. ,例.,例.4,例.5,例.6,例1.4 整型数输出的例子。,/*功能 输出整型数 */ #include void main() int x=2; /* 定义一个整型x,并赋予初值2 */printf(“%d %dn“,x,5); /* printf为输出函数,%d为整型数的输出格式 */,例. ,例.,例.3,例.5,例.6,例1.5 从键盘输入一个双精度数,然后输出。,/*功能 从键盘输入一个双精度数,然后输出 */ #include void main(
16、 ) double x ; scanf(“%lf“, ,程序在运行时会出现一个空屏,此时您应输入一个数据,然后按回车键后在屏幕上输出结果。,例.6,例.3,例. ,例.,例.4,例1.6 从键盘输入一个字符串,然后输出的序。,/*功能:从键盘输入一个字符串,然后输出字符串的程序 */ #include void main() char name10 ; /* name表示存放字符串的首地址,可存放10个字符*/ printf(“请输入您的姓名n“); /* 屏幕输出 */ scanf(“%s“,name); /* 键盘读入字符串,以空格分隔,格式符为%s */ printf(“您的姓名是:%s
17、n“,name); /*表示输出以name为首地址上的内容,直到字符串结束*/ ,例.4,例. ,例.,例.3,例.5,注释有两种形式: 即/* */和/, /* */适合多行注释,/适合单行注释, /*之间不能有空格,/ *为 /* */为, 注释可以用西文,也可以用中文, 注释可以出现在程序中任意地方,它对程序的运行不起作用。, 注释中可以说明变量的含义、程序段的功能,以便帮助人们阅读程序,节目录,scanf、printf 常用格式,节目录,在C语言中,标识符可用作变量名、符号名、函数名、数组名、文件名以及一些具有专门含义的名字。合法的标识符由字母、数字和下划线组成,并且第一个字符必须为字
18、母或下划线,不能跨行书写,自定义标识符不能与关键字同名。,合法的关键字:are、PI、liu_123、liu、e_array;,非法的关键字:are、PI、liu_123、liu、e_array;,C语言的标识符可以分为3类:保留字、预定义标识符、用户自定义标识符。,保留字:保留字也叫关键字,在语言中用来表示某种特点含义的英文单词,预定义标识符:在C语言中都有特定的含义,如C语言提供的库函数的名字(printf)和预编译处理命令(如define)等,用户标识符:由用户根据需要定义的标识符称为用户标识符。一般用来给变量、函数、数组或文件等命名。,节目录,1.3 标识符与保留字,例1.7 下列各组
19、字符序列中,可用作C语言程序标识符的一组字符序列是( )。,C,节目录,解析:C语言规定标识符只能由字母、数字和下划线三种字符组成,而且第一个字符必须是字母或下划线。因而答案c是正确的。,(D),&12x,month,student_n1,(C) D56,r_1_2,name,_st_1#md,(B)Class,day,lotus_1,2day,(A)S.b,sum,average,_above,重 选,重 选,重 选,1.4.1 整型常量,整型常量的定义格式: int const 常量名=常量值; 或:const int 常量名=常量值; 例如:int const x=10; 基本整型常量只
20、用数字表示,不能带小数点,如:12、-l、0等都是合法的整型常量。应该注意常量的值一旦指定,在程序中就不能再改变,在上例程序中如果您试图改变x的值,编译器就会报错。 整型常量通常可分为十进制、八进制和十六进制常量。 十进制常量用一串连续的数字来表示,如:32767、-32768、0等。 八进制常量用数字0开头。如: 05、012、01都是八进制数,它们分别代表十进制数5、10、1。,节目录,1.4 常量,例1.8 在C语言中,错误的int类型的常数( ),(A) 32,(B) 078,(C) 037,(D) 0xAF,解析:C语言规定标识符只能由字母、数字和下划线三种字符组成,而且第一个字符必
21、须是字母或下划线。因而答案b是正确的。,重 选,重 选,重 选,节目录,1.4.2 实型常量,实型常量定义:float const 常量名=常量值; 例如:float const x=2.1; 实型常量也称数值型常量,它们有正值和负值的区分。实型常量通常用带小数点的数字表示,如:3.14159、2.71828、0.0、.54等。,1.4.3 字符常量,字符常量定义:char const 常量名=常量值; 例如:char const ch=A; 字符常量用单引号括起来,例A是字符型常量,而字符串常量用双引号括起来,例“asfgTYN”是合法的无名字符串常量。 由此可见,常量的类型从字面形式即可区
22、分是整型常量、字符型常量还是实型常量。C编译程序就是以此来确定数值常量的类型的。 可以用一个符号名来代表一个常量,但是这个符号名必须在程序中进行特别的“指定”,即符号常量。,节目录,C语言规定,变量可以是任何一种数据类型。例如,整型、短整型、长整型、无符号整型、无符号短整型、无符号长整型、单精度型、双精度型、字符型等基本类型,也可以是数组型、结构型、共用型等构造类型和指针型、枚举型。通常把具有某种数据类型的变量就叫做该类型变量。例如,短整型变量、长整型变量、单精度型变量、双精度型变量、字符型变量等等。基本数据类型符及其含义如表1.1所示。,节目录,1.5 变量,1.5.1 变量的数据类型及其定
23、义,表1.1 基本数据类型符(Visual C+6.0),节目录,当我们说明了一个变量的数据类型,C语言编译系统就要给该变量安排若干个字节,用来存放该变量的值。我们知道,在计算机的寄存器和内存中都可以存放数据,而内存中又可以分为一般数据区和堆栈区。我们把变量存放在何处称为变量的存储类型。用户可以通过说明变量的存储类型来选择变量的具体存储地点。 定义变量存储类型的语句格式如下: 存储类型符 数据类型符 变量名1,变量名2,; 存储类型符及其含义如表1.2所示。,1自动型auto,自动型又称堆栈型。自动型变量是分配在内存的堆栈区。堆栈区内存在程序运行中是重复使用的。当在某个函数中定义了自动型变量,
24、C语言就在堆栈区中给该变量分配字节,用于存放该变量的值。当退出该函数时,C语言就释放该变量,即从堆栈区中收回分配给该变量的字节,以便重新分配给其他自动型变量,这样做的目的是节省内存。,1.5.2 变量的存储类型,节目录,2寄存器型register,寄存器型变量是分配在CPU的通用寄存器中。由于CPU具有的通用寄存器数量有限,C程序中允许定义的寄存器型变量一般以2个左右为宜。如果定义为寄存器型变量的数目超过所提供的寄存器数目,编译系统自动将超出的变量设为自动型变量。对于占用字节数多的变量,如long、float、double类型的变量不能定义为寄存器型变量。寄存器型变量一般是在函数中定义的,退出
25、该函数后就释放它所占用的寄存器。,3静态型static,静态型变量是分配在内存的数据区中,它们在程序开始运行时就分配了固定的字节,在程序运行过程中不释放。只有程序运行结束后,才释放所占用的内存。,4外部参照型extern,外部参照型变量是专门用于多个编译单位之间传递数据用的。当编译单位甲中要使用在编译单位乙中已定义的变量,则在编译单位甲中就要说明该变量是外部参照型,以便C语言编译系统在编译单位甲之外的其他编译单位中寻找该变量的定义。将某个变量说明为其他编译单位定义的变量的方法就是将它说明为“外部参照型”。,节目录,1.5.3 整型数在计算机中的存储方式,计算机中,内存储器的最小存储单位称为“位
26、(bite)”,每一个位中或者存放0,或存放1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节(byte)”,并给4个字节分配一个地址。若干字节组成一个“字(word)”,用一个字来存放一条机器指令或一个数据。一个字含多少个字节随机器而不同。如果一台计算机系统字长为4个字节(l个字节为8个二进制位),就称这台计算机的字长为32位。 一个字节有8个二进制位,本书中把最右边的一位称为最低位,把最左边的一位称最高位。在C语言中,一个int数通常用两个字节存放。其中最高位(最左边的一位)用以存放整数的符号。若是正整数,最高位放置0;若是负整数,最高位放置1。因此,从最高位就立刻能判别出存放
27、的一个整数是正整数还是负整数。C语言中,当用两个字节存放一个整数时,例如整数5在内存中的二进制码为: 0000000000000101。对于正整数的这种存储形式称为用“原码形式”存放。因此用两个字节存放的最大正整数是: 0111111111111111。,节目录,C语言中,对于负整数,在内存中是以整数的“补码”形式存放。取某个二进制码的补码,步骤如下:,(1)求原码: 把数的绝对值用二进制表示,最高位用于表示符号,0表示正数,1表示负数。 (2)求反码。除符号位外把1转换成 0,把0转换成l。 (3)把所求得的反码加l,结果即为所求的补码。,例1.12 求十进制数-5在计算机中的存储形式为(
28、)。求原码:5的二进制表示为0000000000000101,最高位用于表示符号,所以-5原码为:1000000000000101。 求反码:除符号位外,按位取反,即得-5反码为:1111111111111010。 求补码:所求得的反码加l,即得-5补码为: 1111111111111011。,节目录,1.5.4 实型变量,在C语言中可以用两种形式表示一个实型变量或常量。,1小数形式表示,即在数学中常用的实数形式,由数字和小数点组成(注意:必须要有小数点),如 0.123、.123、23、0.0等都是合法的实型常量。,2指数形式表示,这种形式类似数学中的指数形式。在数学中,一个数可以用幂的形式
29、来表示,如2.3026可以表示为0.23026e1,0.0002345可以表示为2.345e-4等形式。C语言的语法规定,字母e(或E)之前必须要有数字,且e或E后面的指数必须为整数。如果写成e3 、.5e3. 、.e3 、e等都是不合法的指数形式。注意:在字母e(或E)的前后以及数字之间不得插入空格。 C语言中实型变量分为单精度型和双精度型两类,分别用类型名float和double进行定义。,节目录,实型变量输入、输出。#include void main() double x,y,z; scanf(“%lf %lf“, ,节目录,例1.16 实型变量输入、输出的例子。,1.5.5 字符变量
30、与字符串,C语言中,一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号括起来作为字符常量。例如:A、C、t、!、?都是合法的字符常量。 C语言中,字符变量用关键字char进行定义,在定义的同时可以赋初值。,1字符量,定义形式: char 变量名1,变量名2,变量名n; 例:char ch;,例: char c1, c2; c1=a; c2=b; 字符变量的值是该变量所代表的字符ASCII代码、与整数的存储形式相似,如字符a的ASCII代码为97,其存储形式为01100001。同理98也可代表字符b,它的存储形式为二进制的01100010。 因而在0127范围内的字符与整型数可以互相
31、赋值,并且所有字符常量都可作为整型量来处理。,节目录,例1.17 字符与整型数互相赋值的例子。,#include void main() int i; char c; i=a; /*字符赋值给整型变量 */ c=97; /*整型数赋值给字符变量*/ printf(“%d %cn“,i,c); c=c+1; printf(“%d %cn“,c,c); i=i+1; printf(”%d %cn“,c,c); ,节目录,2转义字符,转义字符又称反斜线字符,这些字符常量总是以一个反斜线开头后跟一个特定的字符来代表某一个特定的ASCII字符,这些字符常量也必须括在一对单引号内。例如:n表示换行符。 详
32、见表1.3所示。,例1.18 转义字符输出的例子。#include void main() printf(“my name is a Tom“); 先显示My mane is 然后“嘟”,显示Tom。,注意: n与r的区别。,节目录,3字符串,字符串常量是由双引号括起来的一串字符。如“string”就是字符串常量,在C语言中,系统在每个字符串的最后自动加入一个字符0作为字符串的结束标志。请注意字符常量和字符串常量的区别,例如:z是字符常量,在内存中占一个字节;而“abcd”,“z”是字符串常量,前者占五个字节,后者占两个字节的存储空间,其中一个字节用来存放0。两个连续的双引号“”也是一个字符串
33、常量,称作“空串”。但要占一个字节的存储空间来存放0。,注意:(1)字符串的结束符0占内存空间,但在测试字符串长度时不计在内,也不输出。 (2)0为字符串的结束符,但遇到0不一定是字符串的结束,可能是八进制数组成的转义字符常量,如字符串“abc067de”表示6个字符,并非为3个。,节目录,解析:x42、t、101分别代表一个字符,因而此字符串的长度为8。我们可以用以下程序在机器上测试此字符串的长度。,#include #include /*字符串长度测试函数strlen在string.h 库中*/ void main() int x; x=strlen(“mx42tp101qy“); pri
34、ntf(“x=%dn“,x); ,例1.19 求字符串“mx42tp101qy”的长度。,节目录,每一个变量都对应一个或几个存储单元,也就有一个存储单元的首地址与之相对应,这个地址称为“变量的地址”,计算机根据地址对变量进行操作。 例如: int a = 10,b = 20 ; long int c =3000; 变量a、b、c的地址分别用&a、&b、&c表示。,1.6 变量与地址,节目录,注意: 变量的地址由操作系统给定,非人为所定。即把某个地址赋给变量地址是错误的,如语句:&a=2000H;是非法的。但是一旦定义一个变量后,我们可以得到这个变量的地址,例如:,#include void m
35、ain() int j; printf(“%xn“, /*请思考地址输出中不用十进制数形式*/ ,例1.21 当程序中定义某个变量j后,用以下程序可以输出变量j的地址。,例1.23,例1.24,例1.25,例1.26,例1.27,例1.22,#include void main() int a=1; char b=a; float c=5.6; double d=3.2; printf(“%u %dn“, ,例1.22 变量的地址举例。,节目录,例1.23,例1.24,例1.25,例1.26,例1.27,例1.21,1.7.1 赋值运算符及赋值表达式,在C语言中,“=”符号称为赋值运算符,由赋
36、值运算符组成的表达式称为赋值表达式,它的形式如下: 变量名=表达式; 或,变量名1=变量名2=变量名3=变量名n=表达式;,赋值号的左边必须是一个代表某一存储单元的变量名,或是代表某存储单元的表达式,对于初学者来说,只要记住等号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。 赋值运算的功能是先求出右边表达式的值,然后把此值赋给等号左边的变量,确切地说,是把数据放入以该变量为标识的存储单元中去。 在程序中可以多次给一个变量赋值,因此每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋的那个数据。,1.7 赋值运算符与表达式,节目录,例1.23 余数
37、符号举例。,#include void main() printf(“%d %d %d %dn“,5%3,5%-3,-5%3,-5%-3); ,例1.22,例1.24,例1.25,例1.26,例1.27,例1.21,1.7.2 表达式类型的转化,1表达式类型的自动转化,在C语言的表达式中(不包括赋值表达式),如果运算符两边的整数类型不相同,将进行类型之间的转换。转换规则如下: (l)运算符两边一个是短整型,一个是长整型,则短整型转换成长整型,然后进行运算。 (2)运算符两边一个是有符号整型,一个是无符号整型,则有符号整型转换成无符号型,然后进行运算。在C语言的赋值表达式中,赋值号右边的值先转换
38、成与赋值号左边的变量相同的类型,然后进行赋值。,注意: 当赋值号左边的变量为短整型,右边的值为长整型时,短整型变量只能接受长整型数的低位上两个字节中的数据,高位上两个字节中的数据将丢失;也就是说,右边的值不能超出短整型的数值范围,否则将得不到预期的结果。,节目录,解析:无符号数b在内存中占4字节,在内存中表示为: 00000000000000011000000000000000,a为2字节,b赋给a,高位上两个字节中的数据将丢失,a在内存中的表示为:1000000000000000,则a中的值为-32768。,例1.24 无符号数转化为有符号数的例子。,#include void main()
39、 short int a; unsigned long b; b=98304; a=b; printf(“%dn“,a); ,节目录,例1.27,例1.26,例1.25,例1.23,例1.22,例1.21,例1.25 有符号数转化为无符号数的例子。,#include void main( ) short int a=-1; unsigned long b; b=a; printf(“%un“,b); ,例1.22,例1.23,例1.26,例1.27,例1.24,例1.21,2表达式类型的强制转换,强制类型转换表达式的形式如下: 转换格式:(类型名); 其中(类型名)称为强制类型转换运算符,可以
40、利用强制类型转换运算符,将一个表达式的值转换成指定的类型,这种转换是根据人为要求而进行的。,例1.26 类型强制转换的例子。#include void main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%dn“,x,i); ,节目录,例1.27 设x=2.5、a=7、y=4.7,算术表x+a3*(int)(x+y)2( )。,(A)2.5,(B)7,(C)4.7,(D)2.75,解析:取模运算只能在整型数据之间进行,a为整型变量。因为、*、这三个运算符的优先级别相同,而类型转换符优先于*、运算符,a的值为7,73=1,又因为(int)
41、(2.5+4.7)=7,1*7=7,72=1,14=0,所以表达式x+a3*(int)(x+y)24=x+0=2.5。答案:A。,重 选,重 选,重 选,例1.22,例1.24,例1.25,例1.23,例1.26,1.7.3 自反算术赋值运算,在C语言中,如进行某一类运算: i=i+1;或j=j*(x+1); 在C语言中可以分别表示为:i+=1; j*=x+1;把这类运算称为自反算术赋值运算。其格式为: = 它等效为: = 例如: a+=表达式; 等效为:a=a+(表达式); a=表达式; 等效为:a=a(表达式); a*=表达式; 等效为:a=a*(表达式); a=表达式; 等效为:a=a(
42、表达式); a=表达式; 等效为:a=a(表达式);,注意: y*=a+b;应等价于y=y*(a+b);而不是:y=y*a+b;,节目录,解析:先做a+a为20,然后做a=a20;由于在a20中都为整型,不作类型转换,即a=0,所以执行的结果为0。,例1.28 以下程序执行的结果是 :,#include void main() int a=10; a/=a+a; printf(“%dn“,a); ,节目录,例1.22,例1.23,例1.24,例1.25,例1.26,例1.27,1.7.4 连续赋值运算,在C语言中,可以对变量连续赋值,其格式为: =; 先计算值,再将其值赋给,从右到左。 例如:
43、a=b=c=1等效于a=(b=(c=1); 例如:int a=1,b=2; a+=b+(c=8); 求a的值。 解析:8赋给c,b+a+c赋给a,所以a的值为11。,例1.29 如有定义:int a=12 ; 求表达式a+=a=a*=a的值为,(A)12,(B)144,(C)0,(D)132,解析:表达式a+=a-=a*=a的运算方向是自右向左,即先计算a*=a,a值为a*a=144,再计算a-=a,a值为a-a=0,再计算a+=a,故表达式和a的值都为a+a=0。答案:C。,解析:表达式a+=a-=a*=a的运算方向是自右向左,即先计算a*=a,a值为a*a=144,再计算a-=a,a值为a
44、-a=0,再计算a+=a,故表达式和a的值都为a+a=0。答案:C。,解析:表达式a+=a-=a*=a的运算方向是自右向左,即先计算a*=a,a值为a*a=144,再计算a-=a,a值为a-a=0,再计算a+=a,故表达式和a的值都为a+a=0。答案:C。,对的!,节目录,1.7.5 自加+、自减运算-,自加运算符“+”和自减运算符“-”的运算结果是使运算对象的值增1或减1。如:i+; 相当于 i= i+l; i-; 相当于 i= i-l;,注意点:(1)自加、自减运算符是单目运算符,运算对象可以是整型变量,也可以是实型变量,不能是常量和表达式,因为不能给常量或表达式赋值;因此,如+3、(i+
45、j)+等都是不合法的。(2)自加、自减运算符既可做为前缀运算符,也可做为后缀运算符而构成一个表达式,如+i、i-等都是合法的表达式。但无论是作为前缀,还是作为后缀运算符,对于变量本身来说自增1或自减1都具有相同的效果,但作为表达式来说却有着不同的值。,节目录,例1.30 以下程序执行的结果是(),#include void main() int i,j=10; i=j+; printf(“i=%d j=%dn“,i,j); ,解析:无符号数b在内存中占4字节,在内存中表示为: 00000000000000011000000000000000,a为2字节,b赋给a,高位上两个字节中的数据将丢失,
46、a在内存中的表示为:1000000000000000,则a中的值为-32768。,节目录,例1.31 下列程序运行后的结果为( ),#include void main() int x=2 ,i; i=+x; printf(“%d,“,+i); printf(“%dn“,i+); ,解析:+i是在使用i之前,先使i的值加1;i+是在使用i之后,使i的值加1。当执行语句i=+x;后i的值为3,因为此语句等同于+x,i=x;语句printf(“%d,“,+i);相当于+i;printf(“%d,“,i);i的值及输出均为4。语句printf(“%d,“,i+);相当于printf(“%d,“,i)
47、,+i;输出的值为4,i的值为5,不过程序运行后的结果为4,4。,节目录,1.7.6 长度测试运算符sizeof,长度测试运算符sizeof可用测试某个类型变量所占用计算机内存空间的字节长度。 格式:sizeof(类型名) 例如下面的程序段: int a; a=sizeof(float); printf(“%d“,a); 其输出的值为4,因为它是测试float型的数据长度。在Visual C+6.0中一些基本类型的数据长度如下:int : 4字节 char 1字节short int 2字节long int 4字节float 4字节double 8字节,节目录,1.7.7 逗号运算符与逗号表达式
48、,“,”是C语言提供的一种特殊运算符。用逗号将表达式连接起来的式子,称为逗号表达式。 逗号表达式的一般形式为: 表达式1,表达式2,表达式n 说明: (1)逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即,先计算表达式1,最后计算表达式n。最后一个表达式的值就是此逗号表达式的值。 如:(i=3,i+,+i,i+5)这个逗号表达式的值是10,i的值为5。 (2)在所有运算符中,逗号运算符的优先级别最低。 例:x=5*8,6+9;x值为40,整个表达式值为15。 例:x=(i=10,j=5,i*j);x值为50,也是逗号表达式值。 (3)逗号表达式可以嵌套。,节目录,1.7.8 关系运算,