《C语言程序设计-第2章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-第2章.ppt(58页珍藏版)》请在金锄头文库上搜索。
1、网络信息中心教研室网络信息中心教研室 第第 2 2 章章 数据类型、运算符与表达式数据类型、运算符与表达式主要内容主要内容2.2标识符2.3常量2.4变量2.5数据间的混合运算2.6变量赋初值2.1C语言的数据类型2.7运算符和表达式大学计算机基础2网络信息中心教研室1.5 C语言的运行与调试语言的运行与调试1 1C语言的数据类型语言的数据类型2 2基本数据类型在两种环境下的表示基本数据类型在两种环境下的表示大学计算机基础3网络信息中心教研室v一个程序应包含两个方面,即数据结构和算法:(1)为了方便对程序中的数据进行存储和运算,每个数据都要有指定的数据类型和组织形式,叫做数据结构。数据类型是按
2、被定义变量的性质、表示形式、占据存储空间及构造特点进行划分,不同类型数据的数据表示形式、取值范围、占用内存空间的大小及可参与的运算种类也不同;(2)算法是指对操作的描述,一般会给出解决问题的操作步骤。2.1 C语言的数据类型语言的数据类型大学计算机基础4网络信息中心教研室2.1.1 基本数据类型简介基本数据类型简介v基本数据类型基本数据类型C语言中,数据类型可分为:基本类型、构造类型、指针类型和空类型4大类,如下图2-1所示。空类型 构造类型数组类型结构体类型共用体类型整型基本类型字符型实型(浮点型)枚举类型单精度型双精度型指针类型数据类型大学计算机基础5网络信息中心教研室v标识符除了常量的直
3、接使用方式以外,其它方式均要求这些数据有一个名字与之匹配,这个名字就是标识符。C语言中,变量名、符号常量、函数名、数组名、类型名、文件名等字符序列称为标识符。v可用于标识符的字符集C语言规定标识符只能由字母、数字和下画线3种字符组成,且第1个字符不允许为数字.2.2 标识符标识符大学计算机基础6网络信息中心教研室2.2 标识符标识符1 1可用于标识符的字符集可用于标识符的字符集1 1可用于标识符的字符集可用于标识符的字符集2 2标识符的分类标识符的分类大学计算机基础7网络信息中心教研室2.2.1 C语言的字符集语言的字符集C语言的字符集分以下几类语言的字符集分以下几类。v英文大写或小写字母:A
4、Z,az;v数字:1、2、3、9v特殊符号:+、-、*、/、%、=、_、!、(、)、#、$、&、”、|、.、?、等;v转义字符:n、t、v、b、r、f、0、”、ddd、xhh等。大学计算机基础8网络信息中心教研室2.2.2 标识符的分类标识符的分类v标识符可分如下几类:关键字亦称保留字,关键字在C语言中有特定的含义,用户在使用自定义的常量名、变量名、函数名、类型名、文件名时,要绝对避免使用关键字,C语言中的保留字32个,保留字用小写字母表示,大写的可以由用户自由使用,尽量不用,以免与系统保留字混淆.关键字关键字1大学计算机基础9网络信息中心教研室2.2 标识符标识符描述数据类型定义的有:typ
5、edef、void;描述存储类型的有:auto、extern、register、static、volatile;描述数据类型的有:char、int、float、double、long、short、signed、struct、union、unsigned、const、enum;描述语句:break、case、continue、default、if、else、switch、for、do、while、return、sizeof、goto。大学计算机基础10网络信息中心教研室2.2 标识符标识符预定义标识符包括C语言中提供的一些库函数的名字(如printf,scanf,getchar,putchar等
6、)和编译预处理命令(defineinclude等),建议用户在自定义常、变量时,也要避免与这些标识符冲突。 用户在程序设计过程中,会经常用到常量、变量、自定义函数、文件名、类型名等,这些要用户定义。预定义标识符预定义标识符2用户定义标识符用户定义标识符3大学计算机基础11网络信息中心教研室2.2 标识符标识符下面给出一些合法的标识符:sum,average,_total,temp,a_1,char1,Max,min下面这些是不合法的标识符:1a,$total,a,a.next在使用标识符的时候尽量采取“见名识义、常用从简”的原则,保证变量具有可读性,又不要让变量名过长。大学计算机基础12网络信
7、息中心教研室v常量常量程序执行过程中,其值不能被改变的量称为常量,C语言中出现的常量有如下类型:整型常量、实型常量、字符常量、字符串常量等。2.3 常量常量大学计算机基础13网络信息中心教研室2.3 常量常量1 1整型常量整型常量2 2实型常量实型常量3 3字符常量字符常量4 4字符串常量字符串常量5 5符号常量与预处理简介符号常量与预处理简介大学计算机基础14网络信息中心教研室2.3.1 整型常量整型常量2.3.1 整型常量整型常量整型常量在C语言中又分:十进制整数八进制整数十六进制整数十进制整数以人们通常习惯的十进制整数形式给出.八进制整数必须以0开头,其数码取值范围为07.以下是合法的八
8、进制数:012(对应十进制整数10),-012(对应十进制数-10),0177777(对应十进制数65535),0177777(对应十进制数-65535)。十进制整数十进制整数1八进制整数八进制整数2大学计算机基础15网络信息中心教研室2.3 常量常量以下是不合法的八进制整数:255(无前缀0),03A2(包含非法数码)【例例2-1】输出八进制数。#include/*在在visual C+6.0 下调试通过下调试通过*/main() int x,y;x=012;y=-0177777;printf(x=%d,y=%dn,x,y);大学计算机基础16网络信息中心教研室2.3 常量常量 十六进制整数
9、的前缀为十六进制整数的前缀为0x或或0X,其数码取值,其数码取值范围为范围为09,AF,af。 以下是合法的十六进制整数:0X12(十进制数18),-0x12(十进制数-18),0XA1,0Xffff(十进制数为65535)以下各数不是合法的十六进制整数:6B(无前缀0x),0x5H(含有非法数码H)在整型数据的后边加上后缀“L”或“l”(小写字母l)来表示的该数据是一个长整型的数据。例如:589L十进制012L八进制0X17L十六进制十六进制整数十六进制整数3大学计算机基础17网络信息中心教研室2.3.2 实型常量实型常量也称为浮点型。有两种形式:十进制小数形式和指数形式。十进制小数形式:由
10、数码09和小数点组成。如下均为合法的实数:0.12,1.23,-2.5145,125.0指数形式:,由十进制数,加上阶码标志“e”或“E”及阶码(只能为整数,可以带符号)组成。如:指数值如:指数值1.2E6等于1.21065.21E-2等于5.2110-20.91E8等于0.91108-1.8E-9等于-1.810-9大学计算机基础18网络信息中心教研室2.3.3 字符常量字符常量字符常量是用西文半角单引号括起来的一个字符。在C语言中,字符常量有以下特点:(1)字符常量只能用单引号“”括起来,不能用双引号或括号。(2)字符常量只能是单个字符,不能是字符串。(3)字符可以是字符集中任意字符,但数
11、字被定义为字符型之后就不能参与数值运算。大学计算机基础19网络信息中心教研室2.3.3 字符常量字符常量除了以上形式的字符常量外,C语言还允许使用一种特殊形式的字符常量,即转义字符,它以一个反斜线“”开头,后跟一个或几个字符的字符序列。转义字符转义字符转义字符转义字符的意义的意义ASCII代码代码n 换行换行 10t水平制表水平制表 9b退格退格 8r回车回车 13f换页换页 12反斜线符反斜线符 92单引号符单引号符 39”双引号符双引号符 34ddd13位八进位八进制数制数xhh12位十六位十六进制数进制数大学计算机基础20网络信息中心教研室2.3.3 字符常量字符常量【例例2-2】输出转
12、义字符。【程序分析与解答程序分析与解答】#include/*visualC+6.0*/main()printf(abctderftgn);printf(1234567812345678n);/*参照物*/printf(htibbjk);printf(1234567812345678n);/*参照物*/输出结果为:fgde1234567812345678hjk1234567812345678Pressanykeytocontinue大学计算机基础21网络信息中心教研室2.3.4 字符串常量字符串常量是由一对双引号括起的字符序列。例如,“211Project”,“Chinese”,“college
13、”等都是合法的字符串常量。字符串常量和字符常量的数据结构不同,其主要区别如下:(1)字符常量由单引号括起来,字符串常量由双引号括起来;(2)字符常量只能是单个字符,字符串常量含一个或多个字符。大学计算机基础22网络信息中心教研室2.3.4 字符串常量字符串常量C在内存中占一个字节,表示为:“C”在内存中占两个字节,表示为:可以把一个字符常量赋予一个字符变量,但是不能把一个字符串常量赋予一个字符量。字符串常量占的内存字节数等于字符串半角字符数加1,因为在增加的一个字节中存放字符“0”(ASCII码值为0),这是字符串结束的标志。CC0大学计算机基础23网络信息中心教研室2.3.5 符号常量与预处
14、理符号常量与预处理在C语言中,可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define 标识符标识符 常量常量其中,#include也是一条预处理命令(预处理命令都以“#”开头),称为宏定义命令,其功能是把该标识符定义为常量。一经定义,以后程序中所有的标识符都代表该常量,如果要修改这个常量,可以实现整个程序中“一改全改”。经常将符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。大学计算机基础24网络信息中心教研室2.4 变量变量1 1整型变量整型变量2 2实型变量实型变量3 3字符变量字符变量大学计算机基础25网络信息中心教研室变量是指
15、在程序执行过程中可以被改变和赋值的量。程序中每一个变量有一个符合C语言标识符规范的名称,在内存中占据一定的存储单元。变量的使用方法是先声明(定义变量),后使用。变量名与变量值是有区别的,变量的“名”是指变量所代表的存储单元的标志,而“值”是指存储单元的内容.例:2.4 变量变量A_变量变量值3大学计算机基础26网络信息中心教研室2.4.1 整型变量整型变量如:shortintx;/*变量的声明,定义整型变量*/x=10;/*变量赋值*/0000000000001010变量x在内存中的地址是0x0013ff70数据在内存中的二进制存储示意图(1)基本型:类型说明符为int,在内存中占4个字节。(
16、2)短整型:类型说明符为shortint或short,占2个字节。(3)长整型:类型说明符为longint或long,4个字节。(4)无符号型:类型说明符为unsigned,。无符号型又可与上述三种类型匹配而构成,不能表示负数:整型数据在内存中的存储形式整型数据在内存中的存储形式1整型变量的分类整型变量的分类2大学计算机基础27网络信息中心教研室2.4.1 整型变量整型变量【例例2-3】测试当前C编译环境下数据类型占用的字节数。【程序分析与解答程序分析与解答】#includemain()printf(“int占%d字节。n”,sizeof(int);printf(“longint占%d字节。n
17、”,sizeof(longint);printf(“shortint占%d字节。n”,sizeof(shortint);printf(“unsignedint占%d字节。n”,sizeof(unsignedint);printf(“unsignedlongint占%d字节。n”,sizeof(unsignedlongint);printf(“unsignedshortint占%d字节。n”,sizeof(unsignedshortint);输出结果为:int占4字节。longint占4字节。shortint占2字节。unsignedint占4字节。unsignedlongint占4字节。uns
18、ignedshortint占2字节。大学计算机基础28网络信息中心教研室2.4.1 整型变量整型变量变量定义的一般形式为:类型说明符变量名标识符1,变量名标识符2,;例如:intx,y,z;/*x,y,z为整型变量*/longintn,m;/*n,m为长整型变量,longint可简写为long*/unsignedinta,b; /*a,b为无符号整型变量,unsignedint可简写为unsigned*/注意:(1)允许在一次定义相同类型的多个变量(2)最后一个变量名之后必须以分号结尾。整型变量的定义整型变量的定义3大学计算机基础29网络信息中心教研室2.4.2 实型变量实型变量实型数据一般占
19、用4个字节(32位)的内存空间,按指数形式存储。例如,实数12.345在内存中的存储形式如图2-4所示:图2-4实型数据的表示+/-,用0,1表示(数符)0.12345 +/-,用0,1表示(阶符)2实型数据在内存中的存放形式实型数据在内存中的存放形式1大学计算机基础30网络信息中心教研室2.4.2 实型变量实型变量实型变量分为单精度(float型),长单精度型(longfloat),双精度(double型)和长双精度(longdouble型)4类,其中float型占用4个字节,其它数据类型均占用8个字节。由于实型变量由有限的存储单元组成,因此能提供的数字是有限的,而在有效位以外的数字将被舍去
20、。这样可能会产生一些误差,例如,a+20的显然就应该比a大。请分析下面的程序。实型变量数据的分类实型变量数据的分类2实型数据的舍入误差实型数据的舍入误差3大学计算机基础31网络信息中心教研室2.4.2 实型变量实型变量【例2-4】实型数据的舍入误差。【程序分析与解答】#includemain()floata,b;a=123456.789e5;/*12345678900*/b=a+20;printf(%fn,b);输出结果为:12345678868.000000大学计算机基础32网络信息中心教研室2.4.3 字符变量字符变量字符变量用来存储字符常量,其说明符是char.字符变量的赋值有如下方式:
21、(1)若ch_a是一个字符变量,ch=ch_a;(2)将字符常量a赋值给ch,ch=a;(3)将某个字符的ASCII码赋给ch,ch=65,则ch的内容为A,但由于整型变量在存储上均超过1个字节,如果将一个整型变量赋值给一个字符变量时,只会将其最低8个位赋值给ch。而ch=A则是错误的.如下字符变量的输出形式:(1)printf(%c,ch);(2)printf(%d,ch);(3)putchar(ch);大学计算机基础33网络信息中心教研室2.5 数据间的混合运算数据间的混合运算1 1各数据类型转换规则各数据类型转换规则2 2自动类型转换与强制转换自动类型转换与强制转换大学计算机基础34网络
22、信息中心教研室v不同不同数据类型转换规则数据类型转换规则整型、单精度型、双精度型数据可以混合运算。字符型数据可以与整型通用,因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按图所示2.5.1 各数据类型转换规则各数据类型转换规则double float long unsigned int char, short大学计算机基础35网络信息中心教研室2.5.2 自动类型转换与强制转换自动类型转换与强制转换变量的数据类型的转换方法有两种,一种是自动转换,一种是强制转换。自动转换遵循以下规则:v若参与运算量的类型不同
23、,则先转换成同一类型,然后进行运算。v转换按照数据长度增加的方向进行,以保证运算精度不降低。v所有的浮点运算都是以双精度进行的。vchar型和short型运算时,必须先转换成int型。v赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。自动类型转换自动类型转换1大学计算机基础36网络信息中心教研室2.5 数据间的混合运算数据间的混合运算其一般形式为:其一般形式为: (类型说明符)(表达式)例如:(float)a/*把a转换为实型*/(int)(x+y)/*把x+y的结果转换为整型*/无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性
24、转换,而不改变数据说明时对该变量定义的类型。强制转换强制转换2大学计算机基础37网络信息中心教研室2.5.2 自动类型转换与强制转换自动类型转换与强制转换【例例2-5】数据类型的强制转换。【程序分析与解答程序分析与解答】#includemain()floatf=5.75;printf(int)f=%d,f=%fn,(int)f,f);输出结果为:(int)f=5,f=5.750000大学计算机基础38网络信息中心教研室v变量预先设置初值可以有如下几种情况:变量预先设置初值可以有如下几种情况:(1)对各变量分别赋初值inta=3;floatpi=3.14159;charcha;(2)定义变量时对
25、部分变量赋值inta,b,c=5;(3)对几个变量赋相同的初值如:若对几个变量赋予初值3,应写成inta=3,b=3,c3;2.6 变量赋初值变量赋初值大学计算机基础39网络信息中心教研室2.6 变量赋初值变量赋初值强制类型转换运算符强制类型转换运算符 ()自增、自减运算符自增、自减运算符如:+i,-i(在变量i使用之前,先使i的值加(减)1)i+,i-(在变量i使用之后,使i的值加(减)1)使用自增、自减运算符需要注意的若干问题:自增、自减运算符需要注意的若干问题:v+或-运算符,只能用于变量,而不能用于常量或表达式。v+和-的结合方向是“自右至左”。大学计算机基础40网络信息中心教研室2.
26、7 运算符和表达式运算符和表达式1 1C语言运算符简介与表达式的类型语言运算符简介与表达式的类型2 2表达式的求值规则表达式的求值规则3 3算术运算符和算术表达式算术运算符和算术表达式4 4赋值运算符和赋值表达式赋值运算符和赋值表达式5 5逗号运算符和逗号表达式逗号运算符和逗号表达式6 6关系运算符和关系表达式关系运算符和关系表达式7 7逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式大学计算机基础41网络信息中心教研室vC的运算符有以下几类:的运算符有以下几类:(1)算术运算符:+-*/%(2)关系运算符:=!=(3)逻辑运算符:!&|(4)位运算符:|&(5)赋值运算符:=(6)条件运算符:?
27、:(7)逗号运算符:,vC语言表达式的类型语言表达式的类型赋值表达式;算术表达式;关系表达式;逻辑表达式;条件表达式;逗号表达式2.7.1 C语言运算符与表达式的类型语言运算符与表达式的类型大学计算机基础42网络信息中心教研室2.7.2 表达式的求值规则表达式的求值规则这些运算符在C语言中规定了优先级和结合性,在求值时先按运算符的优先级别高低次序执行,如果某个运算对象左右两侧的运算符的优先级别相同,则按规定的“结合方向”处理,其中算术运算符的结合方向为“自左至右”,而对于赋值运算符则采用“自右至左”的结合方向。有关运算符的优先级别和结合性参看附录。大学计算机基础43网络信息中心教研室2.7.3
28、 算术运算符和算术表达式算术运算符和算术表达式(1)+(加法运算符,或正值运算符。如3+5、+3)(2)-(减法运算符,或负值运算符。如5-2、-3)(3)*(乘法运算符。如3*5)(4)/(除法运算符。如5/3,5.0/3)(5)%(模运算符,又称求余运算符,%两侧均应为整型数据,如7%4的值为3)。基本的算术运算符基本的算术运算符1大学计算机基础44网络信息中心教研室2.7.3 算术运算符和算术表达式算术运算符和算术表达式(8)指针运算符:*&(9)求字节数运算符:sizeof(10)强制类型转换运算符:(类型)(11)分量运算符:.-(12)下标运算符:(13)其他:如函数调用运算符()
29、大学计算机基础45网络信息中心教研室2.7.3 算术运算符和算术表达式算术运算符和算术表达式+i,-i(在变量i使用之前,先使i的值加(减)1)i+,i-(在变量i使用之后,使i的值加(减)1)使用自增、自减运算符需要注意的若干问题:(1)+或-运算符,只能用于变量,而不能用于常量或表达式。(2)+和-的结合方向是“自右至左”。算术表达式和运算符的优先级与结合性算术表达式和运算符的优先级与结合性2强制类型转换运算符()强制类型转换运算符()3自增、自减运算符自增、自减运算符 4大学计算机基础46网络信息中心教研室2.7.4 赋值运算符和赋值表达式赋值运算符和赋值表达式赋值符号“=”就是赋值运算
30、符使用“=”连接的式子称为赋值表达式,其一般形式为: 变量变量=常量、变量或表达式常量、变量或表达式赋值运算符具有右结合性。如:a=b=c=3赋值运算符和赋值表达式赋值运算符和赋值表达式1大学计算机基础47网络信息中心教研室2.7.4 赋值运算符和赋值表达式赋值运算符和赋值表达式(1)将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。(3)将一个double型数据赋给float变量时,截取其前面7位有效数字,(4)将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位。(5)字符型数
31、据赋给整型变量时,将字符数据(8位)放到整型变量低8位中。类型转换类型转换2大学计算机基础48网络信息中心教研室2.7 运算符和表达式运算符和表达式在赋值符“=”之前加上其他运算符可以构成复合的运算符。如,+=,-=,*=,/=,%=,=,&=,=,|=。如:a+=2/*等价于a=a+2*/x*=y+8/*等价于x=x*(y+8)*/由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。 它的一般形式为:它的一般形式为:变量赋值运算符表达式复合的赋值运算符复合的赋值运算符3赋值表达式赋值表达式4大学计算机基础49网络信息中心教研室2.7.5 逗号运算符和逗号表达式逗号运算符和逗号
32、表达式逗号运算符是一种特殊的运算,用以连接两个表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为: 表达式表达式1,表达式,表达式2,表达式,表达式n例如x=2*5,x*3,此时整个逗号表达式的值为30。注:赋值运算符的优先级别高于逗号运算符大学计算机基础50网络信息中心教研室2.7.6 关系运算符和关系表达式关系运算符和关系表达式1.关系运算符关系运算符在语言中有以下关系运算符:(1)小于(2)大于(4)=大于或等于(5)=等于(6)!=不等于2.关系表达式关系表达式关系表达式的一般形式为:表达式表达式1 关系运算符关系运算符 表达式表达式2大学计算机基础51网络信息中心教研室2.7.
33、7 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式v逻辑运算符及其优先级逻辑运算符及其优先级语言中提供了三种逻辑运算符:(1)&与运算(2)|或运算(3)!非运算高大学计算机基础52网络信息中心教研室2.7 运算符和表达式运算符和表达式【例例2-6】调试以下程序,理解逻辑表达式。#includemain()charc=k;inti=1,j=2,k=3;floatx=3e+5,y=0.85;printf(%d,%dn,!x*!y,!x);printf(%d,%dn,x|i&j-3,ij&xy)?x:y(2)条件运算符“?”和“:”是一对运算符,不能分开单独使用。(3)条件运算符的结合性是自右至左。
34、例如:ab?a:cd?c:d应理解为ab?a:(cd?c:d)大学计算机基础54网络信息中心教研室2.7 运算符和表达式运算符和表达式【例例2-7】调试以下程序,理解条件表达式。#includemain()intx,y,max;printf(g请输入两个整数,x,y:);scanf(%d,%d,&x,&y);printf(最大值=%dn,xy?x:y);输出结果为:请输入两个整数,x,y:3,5最大值=5大学计算机基础55网络信息中心教研室2.7.9 位运算符和位运算位运算符和位运算v位运算符和位运算位运算符和位运算分别是分别是:(1)&按位与运算符(2)|按位或运算符(3)按位异或运算符(4)取反运算符(5)右移运算符大学计算机基础56网络信息中心教研室2.7 运算符和表达式运算符和表达式若变量A的值为0xAA(10101010),B的值为0x55(01010101),则:(1)A&B=0x00(00000000b)按位与(2)A|B=0xFF(11111111b)按位或(3)AB=0xFF(11111111b)按位异或(4)A=0x55(01010101b)取反(5)A1=0x2A(00101010b)右移以上运算符在第10章将会进行详细讲解。大学计算机基础57网络信息中心教研室本章内容完结!本章内容完结!本章内容完结!本章内容完结!大学计算机基础58网络信息中心教研室