C语言程序设计课件完整版课件.ppt
C语言程序设计主讲人:汪洋主讲人:汪洋在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确第一章 C语言概述&C语言的发展与特点&C语言的基本程序结构&C语言程序的开发过程&C语言的基本词法&算法在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.1 C语言出现的历史背景l汇编语言依赖于计算机硬件,程序的可读性和可移植性差;l一般高级语言难以实现汇编语言的某些功能如对内存地址的操作、位操作等。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.2 C语言的发展史l1960年 ALGOL 60;l1963年 英国剑桥大学提出CPL语言;l1967年 Matin Richards提出BCPL语言;l1970年 Ken Thompson提出B语言;l1972-1973 Dennis.M.Ritchie提出C语言;lBrian W.Kernighan 和D.M.Ritchie介绍标准C;l1987年美国国家标准化协会提出ANSI C。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.3 C语言的特点l简洁、紧凑,使用方便、灵活;l允许直接访问地址,能进行位操作;l运算符丰富;l数据类型丰富;l结构化程序语言,便于实现程序的模块化;l程序执行效率高,可移植性好。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.4 C语言的基本程序结构lC程序是由函数构成的,每个C程序有且只有一个主函数(main),可包含若干其他函数;l每个函数由首部与函数体组成;首部包括函数类型、函数名、函数参数(形参)、参数类型,int max(int x,int y)函数体包括声明部分和执行部分。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确lmain函数位置任意,但总是从main函数开始执行,在main函数中结束;lC程序书写自由,每个语句后需加一个分号;l主函数可调用任何非主函数,非主函数之间可互相调用,但不能调用主函数;lC语言本身没有输入输出语句;l用/*/进行注释。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.5 C语言程序的开发过程l编辑l编译l链接 计算机只能识别和执行由0和1组成的二进制的指令,为了使计算机能执行高级语言源程序,必须先用“编译程序”把源程序翻译成二进制形式的“目标程序”,然后将该目标程序与系统的函数库和其他目标程序连接成为可执行的目标程序。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.6 C语言的基本词法l字符集:包括大小写英文字母52个、数字10个、键盘符号33个、转义字符。l标识符:是用户自定义的一组字符序列,用来表示程序中需要辨认的对象名称,如符号常量、变量、数组、函数。规定:n 标识符是由字母或下划线开头的字母、数字、下划线组成的一串符号,最长不能超过32个字符;n大小写字母有区别,大写字母只用来定义宏名,其他都采用小写字母表示。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l保留字:32个,有特殊含义,主要用于构成语句,进行存储类型和数据类型的定义,不允许用户作为自定义标识符使用;l词类:常量、变量、运算符、函数、表达示、保留字;l语句:完成特定的操作,语句的有机组合序列完成指定的功能;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确语句的种类l赋值语句;l函数调用语句;l表达式语句;l流程控制语句;l复合语句;l空语句;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.7 算法著名计算机科学家沃思提出公式:程序=数据结构+算法v数据结构:对数据的描述即指定数据的类型和数据的组织形式;v算法:对操作的描述即操作步骤。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.7.1 简单算法举例判定2000-2500年中的每一年是否闰年。设定y为被检测的年份。算法如下:lS1:2000=ylS2:若y不能被4整除,则输出y“不是闰年”,然后转至S6lS3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转至S6lS4:若y能被100整除,又能被400整除,输出y“是闰年”;否则输出y“不是闰年”,然后转至S6lS5:输出y“不是闰年”lS6:y+1=ylS7:当y2500,算法停止;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.7.2 算法的特点l有穷性;l确定性;l有零个或多个输入;l有一个或多个输出;l有效性在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确1.7.3 算法的表示l用流程图表示算法;l用伪代码表示算法;l用计算机语言表示算法。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确第二章 C语言的数据类型、运算符与表达式&C语言的数据类型;&C语言的运算符与表达式;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.1 C语言的数据类型数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型(void)整型整型(int)字符型字符型(char)实型(浮点型)实型(浮点型)数组类型数组类型结构体类型结构体类型(struct)共用体类型(联合类型)共用体类型(联合类型)(union)枚举类型枚举类型单精度型单精度型(float)双精类型双精类型(double)在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2 常量 在程序运行过程中,其值不能被改变的量称为常量。C语言中规定的常量类型有以下五种:整型常量、实型常量、字符常量、字符串常量和符号常量。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2.1 整型常量 1.整型常量的表示方法:l十进制整数:无前缀,数码取值为09,如123,-456。l八进制整数:前缀为0,数码取值为07,如0123,-011。八进制数与十进制数的转换方法如下:(0123)8=1*82+2*81+3*80=64+16+3=(83)10在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l十六进制整数:前缀0X或0 x,数码取值为09,AF或af,如0 x2A,-0 x12。十六进制数与十进制数转换方法:(-0 x12)16=-(1*161+2*160)=-(16+2)=(-18)102.整型常量的后缀:l加后缀L或l,表示长整型数。l加后缀u,表示无符号数。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2.2 实型常量n实型常量即实数又称为浮点数,C语言中实数只采用十进制,有两种表示形式:l小数形式:由数码09和小数点组成(注意必须有小数点),如.123,-123.4567;l指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数),如 -2.1e2,2.1e-2。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2.3 字符常量C语言中,字符常量是用单引号括起来的单个字符,如a,$等。转义字符是一种特殊形式的字符常量,它是以一个“”开头的字符序列。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确表表2.12.1转义字符及其含义转义字符及其含义字符形式含义n换行,将当前位置移到下一行开头t水平制表(跳到下一个tab位置)b退格,将当前位置移到前一列r回车,将当前位置移到本行开头f换页,将当前位置移到下页开头反斜杠字符“”单引号字符”双引号字符ddd1到3位8进制数所代表的ASC字符xhh1到2位16进制数所代表的ASC 字符在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.1转义字符的使用main()printf(“abctderftgn”);printf(“htibbjk”);在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.1结果 程序运行后在打印机上得到以下结果:fabcgdehjik 注意在显示屏上最后看到结果以与上述打印结果不同,是:fgdehjk在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2.4 字符串常量 C语言中,字符串变量是由一对双引号括起来的字符序列,如“China”,“$3.232”。注意:不要将字符常量与字符串常量混淆。注意:不要将字符常量与字符串常量混淆。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确字符常量与字符串常量的区别l字符常量是由单引号括起来的,字符串常量是由双引号括起来的;l字符常量只能是单个字符,字符串常量则可是零个或多个字符;l可把一个字符常量赋予一个字符变量,但不能把一个字符串变量赋予一个字符变量,C语言中没有相应的字符串变量,可用字符数组来存放字符串常量;l字符常量占一个字节的内存,字符串常量占的内存字节数等于字符串中字节数加1,最后一个字节存放字符0作为字符串结束标志。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.2.5 符号常量 C语言中,可用一个标识符来表示一个常量,称为符号常量又称为宏定义,使用前须先定义,其定义规则为:#define 标识符 常量在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.2 符号常量的使用#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);使用符号常量的好处:使用符号常量的好处:含义清楚;含义清楚;在需要改变一个常量在需要改变一个常量时能做到时能做到“一改全改一改全改”;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.3 变量 变量是指在程序运行中其值是变化的量。一个变量应该有一个变量名,在内存中占据一定的存储单元,在该存储单元中存放变量的值。3变量值变量值a变量名变量名存储单元存储单元图图2.1在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确语言中,要求对变量作强制定义,即“先定义,后使用”。l便于发现错误;l为每一个变量指定确定类型,在编译时就能为其分配相应的存储单元。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确整型数据在内存中的存储方式 整型数据在内存中是以二进制形式存放的。若定义了一个整型变量i:int i=10;图3.2(a)是数据存放的示意图,图3.2(b)是数据在内存中实际存放的情况;i10(a)i0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0(b)图图2.2在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确 实际上,整型数值是以补码表示的。一个正数的补码与其原码相同,求负数的补码方法:将该数的绝对值的二进制形式按位取反再加1。例如求-10的补码:0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 01 1 1 1 1 1 1 1 1 1 1 1 0 1 0 11 1 1 1 1 1 1 1 1 1 1 1 0 1 1 010的原码的原码取反取反再加再加1得得-10的的补码补码在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确.3.1 整型变量l有符号基本整型signed intl有符号短整型 signed short intl有符号长整型 signed long intl无符号基本型 unsigned intl无符号短整型 unsigned short intl无符号长整形 unsigned long int.整型变量的分类:在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确类型说明符数的取值范围字节数signed int-3276832767 即-215(215-1)2unsigned int065535 即 0(216-1)2signed short int-3276832767 即-215(215-1)2unsigned short int065535 即 0(216-1)2signed long int-21474836482147483647 即-231(231-1)4unsigned long int04294967295 即 0(232-1)4表表2.1整型数据的所占的内存字节数与取值范围整型数据的所占的内存字节数与取值范围在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.整型变量的说明 类型说明符 变量名标识符,变量名标识符,.;如:int a,b,c;unsigned short x,y;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.3 整型变量的定义和运算见教材P34例2.3在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.3.2 实型变量l单精度型 float 占4个字节内存,提供7位有效数字,l双精度型 double 占8个字节内存,提供16位有效数字。整数没有误差,实数有精度,有误差,提供6位小数,7位有效数字。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.实型变量的说明格式和书写规则同整型变量说明相同,如:float s,t;double h,k;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例例2.4实型数据的舍入误差实型数据的舍入误差main()float a,b;a=123456.789e5;b=a+20;printf(“%f,%f”,a,b);结果:结果:12345678848.000000,12345678848.000000在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确误差原因分析误差原因分析 b的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确表示该数,从结果看出,把20加在后几位上,是无意义的,应当避免将一个很大的数与一个很小的数直接相加减,否则就会“丢失”小的数。与此类似,用程序计算1.0/3*3的结果并不等于1。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.3.3 字符变量 字符变量用来存放字符常量,只能存放一个字符,占用1个字节内存。字符变量定义如下:char c1,c2;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l1.字符数据在内存中的存储字符数据在内存中的存储 将一个字符常量放到一个字符变量中,不是把该字符本身放到内存单元中,而是将该字符的相应的ASC 代码存放在存储单元中,如字符a的ASC 代码为97,b为98,9798c1c20 1 1 0 0 0 0 10 1 1 0 0 0 1 0c1c1图图2.3在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确 在内存中,字符数据以ASC码存储,它的存储形式与整数存储形式类似,C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型量。在输出时,允许把字符变量按整型量输出,也允许把整型变量按字符型量输出。注意:当整形变量按字符型量处理时,只有低八位参与处理。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.5 向字符型变量赋以整型值main()char c1,c2;c1=97;c2=98;printf(“%c,%cn”,c1,c2);printf(“%d,%dn”,c1,c2);结果:a,b97,98在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.补充补充 Turbo C将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signed char型。它的取值范围是-128127。如果使用ASC码为0127间的字符,由于字节中最高位为0,因此用%d输出时,输出一个正整数。如果使用ASC码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。例如:main()char c=130;printf(“%d”,c);得到-126。如果不想按有符号处理,可以将变量定义为unsigned char类型,这时其取值范围是0255。signed char和unsigned char 相仿,但它只有一个字节。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.6main()char c1=130;unsigned char c2=130;printf(“c1=%d,c2=%dn”,c1,c2);结果:结果:c1=-126,c2=130在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.3.4 变量赋初值 程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化,如int a=3;float f=3.56;char c=a;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确 也可以使被定义的变量的一部分赋初值,如:int a,b,c=5;如果对几个变量赋予初值3,应写成int a=3,b=3,c=3;不能写成:int a=b=c=3;int a=3;相当于:int a;a=3;在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.4 运算符和表达式运算符和表达式l运算符是一些特定的符号,它用来对数据进行某些特定的操作;l运算对象(操作数)是用来进行运算的数据,包括常量、变量等;l表达式是用运算符将运算对象连接起来的式子。如1+2,1和2为运算对象,而1+2就是表达式。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.4.1 运算符种类、优先级和结合性运算符种类、优先级和结合性l算术运算符算术运算符 用于各类数值计算。运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运运算,%)、自增(+)、自减(-)。l关系运算符关系运算符 用于比较运算。运算符主要有:大于()、小于(=)、小于等于(=)和不等于(!=)。1.运算符的种类运算符的种类在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l逻辑运算符逻辑运算符 用于逻辑运算。运算符有:与(&)、或(|)、非(!)。l位操作运算符位操作运算符 参与运算的量,按二进制位进行运算。运算符有:按位与(&)、按位或(|)、取反()、按位异或()、左移()。l赋值运算符赋值运算符 用于赋值运算。赋值运算符有:简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)、复合位运算赋值(&=,|=,=,=)等三类。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l条件运算符条件运算符 是一个三目运算符,用于条件求值。运算符有:(?:)。l逗号运算符逗号运算符 用于把若干表达式组合成一个表达式。运算符有:(,)。l指针运算符指针运算符 用于取内容(*)和取地址(&)两种运算。l求字节运算符求字节运算符 用于数据类型所占的字节数(sizeof)。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表 达式转换成所需类型。其一般形式为:(类型名)(表达式)如(double)a;(int)(x+y);(float)(5%3)l其他运算符其他运算符 其他运算符有:括号()、数组下标、成员运算符.和用指针访问结构体成员的指向运算符-。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.运算符的运算优先级运算符的运算优先级 C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级低的进行运算。如求表达式x+y*z的值:y的值左侧为加号,右侧为乘号,而乘号优先于加号,因此相当于x+(y*z),即先进行乘法运算,然后再进行加法运算。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确3.运算符的结合性运算符的结合性 C语言的运算符不仅具有不同的优先级,还有结合性的问题。在表达式的运算过程中,各运算对象参与运算的先后顺序不仅要遵循运算符优先级别的规定,还要受运算符结合性的制约,当一个运算对象两侧的运算符优先级别相同时,需按运算符的结合性来处理,以便确定是自左向右进行运算还是自右向左进行运算。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确 C语言中运算符的结合性分为两种:即左结合性(自左向右)和右结合性(自右向左)。例如:算术运算符就是左结合性的运算符算术运算符就是左结合性的运算符 表达式:x-y+z,运算对象y的左侧运算符“-”和右侧运算符“+”优先级相同,应按结合性来进行自左向右的运算,即先执行x-y运算,再执行+z的运算。赋值运算符是右结合性的运算符赋值运算符是右结合性的运算符 表达式:x=y=z,由于赋值运算符“=”的右结合性,所以先执行y=z运算,再执行x=(y=z)运算。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确优先级别运算符运算形式结合方向含义1().-(e)aex.yp-x自左至右圆括号数组下标运算符结构体成员运算符指向结构体成员运算符2-+-!(t)*&sizeof-e+x或x+!et(t)e*p&xsizeof(t)自右至左负号运算符自增运算符和自减运算符逻辑非运算符按位取反运算符强制类型转换运算符指针运算符,由地址求内容求变量地址的运算符求某类型变量的长度运算符3*/%e1*e2自左至右乘、除、求余运算符表表2.2 C语言各运算符的优先级别与结合方向语言各运算符的优先级别与结合方向在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确4+-e1+e2自左至右加法、减法运算符5e1e2自左至右左移、右移运算符6 =e1=单目单目运算符算术运算符算术运算符关系运算符运算符逻辑运算符逻辑运算符(不包括不包括!)条件运算符条件运算符赋值运算符赋值运算符逗号运算符逗号运算符 优先级别由上到下递减。优先级别由上到下递减。特殊运算符优先级最高,逗特殊运算符优先级最高,逗号运算符优先级最低。位运号运算符优先级最低。位运算符的优先级比较分散算符的优先级比较分散(有有的在算术运算符之前的在算术运算符之前(如如),有的在关系运算符之前有的在关系运算符之前(如如),有的在关系运算符有的在关系运算符之后之后(如如&、|)。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.4.2 算术运算符和算术表达式算术运算符和算术表达式l 1.1.基本的算术运算符基本的算术运算符 基本的算术运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)五种。两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,多数机器采取“向零取整”的方法,即5/3=1,-5/3=-1,取整后向零靠拢。求余运算符“%”要求参与运算的量均为整型,运算结果等于两数相除后的余数,余数的符号取决于被除数的符号,如-100%3余数为-1,100%-3余数为1。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l 2.自增自减运算符自增自减运算符+i,-i 在使用i之前,先使i的值加(减)1i+,i-在使用i之后,再使i的值加(减)1 粗略地看,+i和i+的作用相当于i=i+1,但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.6 如果i的原值等于3,执行下面的赋值语句:j=+i;(i的值先变为4,再赋给j,j的值为4)j=i+;(先将i的值3赋给j,j的值变为3,然后i的值变为4)在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.7P35例2.5main()int c=5;printf(“%d,%d,%dn”,c+=c+,c+8,+c);printf(“%dn”,c+=c+,c+8,+c);注意注意:Turbo C规定,规定,printf()函数中出现多个表达式输函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后出项时,先按从右到左的顺序计算各表达式的值,然后再从左到右输出结果。本例中先计算再从左到右输出结果。本例中先计算+c,得得c=6,然后计然后计算算c+8得得14,最后计算,最后计算c+=c+,得得c=13。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l1.有如下两个程序,试比较结果 main()int i=3;printf(“%d,%dn”,(i+)+(i+)+(i+),i);main()int i=3,k;k=(i+)+(i+)+(i+);printf(“%d,%dn”,k,i);补充:补充:结果:结果:12,312,3结结果:果:9,69,6在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l2.当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可以多的符号组成运算符。例如:设整型变量x,y均为3,则:x+y 应理解为(x+)+y,结果为6,x值 为4,y值不变 x-y 应理解为(x-)-y,结果为0,x值 为2,y值不变在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确3.算术运算符的优先规则算术运算符的优先规则单目算术运算符(-、+、-)优先于*、/、%算术运算符优先于+、-算术运算符;同级单目算术运算符的结合性自右向左;同级双目算术运算符的结合性自左向右。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l 4.算术表达式算术表达式 用算术运算符和括号将运算对象连接起来的式子,称为算术表达式。例如下面的表达式为算术表达式:a*b/c-1.5+a 如果一个算术运算符的两侧的数据类型不同,则按下面所述的内容先自动进行类型转换,使二者具有同一类型,然后再进行运算。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确各类数值型数据间的混合运算各类数值型数据间的混合运算 整型(包括 int,short,long,unsigned int,unsigned short,unsigned long)和实型(包括 float,double)数据可以混合运算。而字符型数据可以与整型通用,因此整型、实型和字符型数据间可以混合运算,在进行运算时,不同类型 的数据要先换成同一类型,然后进行运算,转换规则如下图所示:在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确doublefloatlongunsignedintchar,short高高低低 图中横向向左的箭头表示必须的转换,如字符数据必须先转图中横向向左的箭头表示必须的转换,如字符数据必须先转换为整数,换为整数,short型转换为型转换为int,float型数据在运算时一律先转换型数据在运算时一律先转换为为double型,以提高精度型,以提高精度(即使是两个即使是两个float型数据相加,也先型数据相加,也先都化成都化成double型,然后再相加型,然后再相加)。纵向的箭头表示当运算为不同类型时转换的方向。例如纵向的箭头表示当运算为不同类型时转换的方向。例如int型与型与double型数据进行运算,先将型数据进行运算,先将int型数据转换为型数据转换为double型,型,然后在两个同类型然后在两个同类型(double型型)数据间进行运算,结果为数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为向高转换。不要理解为int型先转换为型先转换为unsigned int型,再转成型,再转成long型,再转成型,再转成double型。如果一个型。如果一个int型数据与一个型数据与一个double型型数据运算,是直接将数据运算,是直接将int型转换成型转换成double型。型。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.8 假设已指定i为int型变量,f为float型变量,d为double型变量,e为long型变量,有以下式子:10+a+i*f-d/e在计算机执行时从左至右扫描,运算次序为:在计算机执行时从左至右扫描,运算次序为:进行进行10+a的运算,先将的运算,先将a转换为整数转换为整数97,运算结果为运算结果为107;由于由于“*”比比“+”优先,先进行优先,先进行i*f的运算。先将的运算。先将i与与f都转换成都转换成double型,运算结果为型,运算结果为double型;型;整数整数107与与i*f的结果相加。先将整数的结果相加。先将整数107转换成转换成double型,再相型,再相加,结果为加,结果为double型;型;将变量将变量e化为化为double型,型,d/e结结果为果为double型;型;将将10+a+i*f的结果与的结果与d/e的商相减,的商相减,结果为结果为double型型。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:结果:x=3.600000,i=3 上述类型转换由系统自动进行的,另一种类型转上述类型转换由系统自动进行的,另一种类型转换为强制类型转换。换为强制类型转换。需要说明的是在强制类型转换时,得到一个所需需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。如:类型的中间变量,原来变量的类型未发生变化。如:(int)x;如果如果x原来指定为原来指定为float型,进行强制类型运算型,进行强制类型运算后得一一个后得一一个int型的中间变量,它的值等于型的中间变量,它的值等于x 的整数部的整数部分,而分,而x的类型不变的类型不变(仍为仍为float型型)。见下例。见下例2.9:在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确2.4.3 关系运算符和关系表达式关系运算符和关系表达式所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为逻辑值“真”(即“条件满足”),用整数“1”来表示;如果a的值为2,不满足“a3”的条件,则称关系表达式的值为逻辑值“假”,用整数“0”来表示。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确l l1.关系运算符及其优先次序关系运算符及其优先次序C语言提供下面语言提供下面6种关系运算符:种关系运算符:(小于小于)(大于大于)=(大于等于大于等于)=(等于等于)!=(不等于不等于)优先级相同优先级相同(高)高)优先级相同优先级相同(低)低)关于优先顺序:关于优先顺序:前前4 4种关系运算符种关系运算符(、=)的优先级别相同,后的优先级别相同,后2种也相同。前种也相同。前4种高于后种高于后2种;种;关系运算符的优先级低于算术运算符;关系运算符的优先级低于算术运算符;关系运算符的优先级高于赋值运算符。关系运算符的优先级高于赋值运算符。在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.10例如:ca+b 等效于c(a+b)ab=c 等效于(ab)=ca=bc 等效于a=(bc 等效于a=(bc)在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确 用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5=3”的值为“假”,“5=0”的值为“真”。C语言没有逻辑型数据类型,以1代表“真”,以0代表“假”。l2.关系表达式关系表达式在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确例2.11a=3,b=2