数据类型、运算符与表达式.ppt_第1页
数据类型、运算符与表达式.ppt_第2页
数据类型、运算符与表达式.ppt_第3页
数据类型、运算符与表达式.ppt_第4页
数据类型、运算符与表达式.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章 数据类型、运算符与表达式,C程序设计,教学内容 1 常量与变量 2 整型数据 3 实型数据 4 字符型数据 5 变量赋初值 6 各类数据之间的混合运算 7 算述运算符与算术表达式 8 赋值运算符与赋值表达式 9 逗号运算符与逗号表达式 重点: 常用数据类型、常用运算符、数学公式转化为 C 语言表达式的基本能力。,2.2 C的数据类型,程序处理的对象是数据。 数据以某种特定的形式存在(如整数、实数、字符) C语言中数据是有类型的,数据的类型简称数据类型。 例如,整型数据、实型数据、整型数组类型、字符数组类型(字符串)分别代表我们常说的整数、实数、数列、字符串。,数据类型(Data Type),注意: 1、不同的数据类型有不同的取值范围。 如有符号整数取值范围 -3276832767, 浮点数 -3.4e-383.4e38。 2、不同的数据类型有不同的操作。如整型数可以取余操作,实型数据却不行;整型、实型数据可以有加法,字符数组不行。 3、C语言的数据类型可以构造复杂的数据结构。,2.3 常量与变量,2.2.1 常量 在程序的运行过程中,其值不能改变的量称为常量。 注意: 1、常量有不同的类型,如12、0、-3为整型常量,4.6、-1.23为实型常量,a、d字符常量。常量可以从字面形式即可判断。 2、符号常量 #define PI 3.1416,使用符号常量的好处: (1)含义清楚、见名知意。 (2)修改方便、一改全改。 例2-1:符号常量应用 #define PI 3.14 main() float area; area=10*10*PI; printf(“area=%fn“,area); 结果:area=314.000000,在程序的运行过程中,其值可以改变的量 注意: 一个变量必须有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。,2.2.2 变量,注意: 1 、变量名(用标识符表示)、变量在内存中占据的 存储单元、变量值三者关系。 变量名在程序运行过程中不会改变,变量的值 可以改变。变量名遵守标识符准则。,变量名:标识符 由英文字母、数字和下划线组成,大小写敏感 不可以是数字开头 直观,见名知意,便于记忆和阅读 最好使用英文单词或其组合 切忌汉语拼音 下划线和大小写通常用来增强可读性 variablename variable_name VariableName, variableName,2、C语言中变量:“先定义,后使用”。 即就是说,C要求对所有用到的变量做强制定义。 1)只有申明过的变量才可以在程序中使用,这使得变量名的拼写错误容易发现。 例如,如果在定义部分写了 int count; 而在程序中错写成conut,如:conut=5; 在编译时检查出conut未经定义,不作为变量名,因此输出“变量conut未经说明”的信息,便于用户发现错误,避免变量名使用时出错。 2)申明的变量属于确定的类型,编译系统可方便地检查变量所进行运算的合法性。 3)在编译时根据变量类型可以为变量确定存储空间,“先定义后使用”使程序效率高。,2.4 整型数据、实型数据和字符型数据,2.4.1 整型数据 C语言中的整型数据包括整型常量和整型变量 1. 整型常量 整型常量就是整常数。 在语言中,使用的整常数有八进制、十六进制和十进制三种,使用不同的前缀来相互区分。除了前缀外,C语言中还使用后缀来区分不同长度的整数。,八进制整常数 八进制整常数必须以0开头,即以0作为八进制数的前缀。 如0123表示八进制数123,即(123)8 ,等于十进制数83; -011表示八进制数-11,即(-11)8 ,等于十进制数-9。 以下各数是合法的八进制数: 015(十进制为13),0101(十进制为65),0177777(十进制为65535)。 以下各数不是合法的八进制数: 256(无前缀0),0382(包含了非八进制数码8)。,(2) 十六进制整常数 十六进制整常数的前缀为0X或0x。 如0x123表示十六进制数123,即(123)16 ,等于十进制数291; -0x11表示十六进制数-11,即(-11)16 ,等于十进制数-17。 以下各数是合法的十六进制整常数: 0X2A(十进制为42),0XA0 (十进制为160),0XFFFF (十进制为65535)。 以下各数不是合法的十六进制整常数: 5A (无前缀0X),0X3H (含有非十六进制数码)。,(3) 十进制整常数 十进制整常数没有前缀,数码取值为09。 以下各数是合法的十进制整常数: 237,-568,1627。 以下各数不是合法的十进制整常数: 023 (不能有前导0),23D (含有非十进制数码)。 在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错,造成结果不正确。,(4) 整型常数的后缀 在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。 十进制无符号整常数的范围为065535, 有符号数为-32768+32767。 八进制无符号数的表示范围为00177777。 十六进制无符号数的表示范围为0X00XFFFF或0x00xFFFF。,如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的(注意,字母“L”的小写形式“l”与数字“1”看上去很相似)。 例如: 十进制长整常数 158L (十进制为158)、358000L (十进制为358000)。 八进制长整常数 012L (十进制为10)、0200000L (十进制为65536)。 十六进制长整常数 0X15L (十进制为21)、0XA5L (十进制为165)、0X10000L (十进制为65536)。,长整数158L和基本整常数158 在数值上并无区别。 但 158L,分配4个字节存储空间; 158, 只分配2 个字节的存储空间。 因此在运算和输出格式上要予以注意,避免出错。 无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u、0x38Au、235Lu 均为无符号数。 前缀,后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。,2. 整型变量 整型变量的分类 整型变量可分为基本型、短整型、长整型、和无符号型四种。 基本型:类型说明符为int,在内存中占2个字节(在IBM PC上,下同),其取值为基本整常数。 短整型:类型说明符为short int或short。所占字节和取值范围均与基本型相同。 长整型:类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。 无符号型:类型说明符为unsigned,存储单元中全部二进位(bit)用作存放数本身,而不包括符号。无符号型又可与上述三种类型匹配而构成: 无符号基本型,类型说明符为unsigned int或unsigned。 无符号短整型,类型说明符为unsigned short。 无符号长整型,类型说明符为unsigned long。,各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数,但可存放的数的范围比一般整型变量中数的范围扩大一倍。,例2.4 程序举例。 main( ) int a,b; a=3; b=5; printf(“a+b=%dn“,a+b); ,实型常量 实型也称为浮点型。实型常量也称为实数或者浮点数。 在语言中,它有二种形式,十进制数形式和指数形式。 十进制数形式 由数码0 9和小数点组成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的实数。,2.4.2 实型数据,(2) 指数形式 由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。 其一般形式为aEn(a为十进制数,n为十进制整数) 其值为a*10n,如:2.1E5 (等于2.1*105), 3.7E-2 (等于3.7*10-2), -2.8E-2 (等于-2.8*10-2) 以下不是合法的实数: 345 (无小数点),E7 (阶码标志E之前无数字),53.-E3 (负号位置不对),2.7E (无阶码)。 标准允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356f和356.是等价的。,2. 实型变量 实型变量分为两类:单精度型,双精度型。 单精度型,类型说明符为float,在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-383.4E+38,只能提供 7位 有效数字。 双精度型,类型说明符为double ,在Turbo C中双精度型占8个字节(64位)内存空间,其数值范围为1.7E-3081.7E+308,可提供 16位 有效数字。 实型变量说明的格式和书写规则与整型相同。 例如: float x,y; /*x,y为单精度实型变量*/ double a,b,c; /* a,b,c为双精度实型变量*/,例2.5 程序举例。 main( ) float a; a=0.123456789; printf(“a=%f“,a); 运行 a=0.123457 分析 由于单精度实型变量只能接收7位有效数字,因此上例中最后两位小数不起作用。如果a改为双精度实型变量,则能全部接收上述9位数字并存储在变量a中。 Turbo C规定小数后最多保留6位,其余部分四舍五入,例2.6 程序举例,说明float和double的不同。 void main() float a; double b; a=33333.33333; b=33333.33333333333333; printf(“a=%fnb=%fn“,a,b); 运行 a=33333.332031 b=33333.333333 分析 由于a是单精度浮点型,有效位数只有7位。而整数已占5位,故小数2位后之后均为无效数字。b是双精度型,有效位为16位。但Turbo C规定小数后最多保留6位,其余部分四舍五入。,2.4.3 字符型数据,字符型数据包括字符常量、字符变量和字符串常量。 字符常量 字符常量是用单引号括起来的一个字符。例如:a、b、A、+、?都是合法字符常量。 (1) 字符常量只能用单引号括起来,不能用双引号或其它括号。 (2) 字符常量只能是单个字符,不能是字符串。 (3) 字符可以是字符集中任意字符。但数字被定义为字符型之后就不再是原来的数值了。如:5和5是不同的量。5是字符常量,5是整型常量。,C语言还允许用一种特殊形式的字符常量,即转义字符。 转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。 例如,在前面各例题printf函数的格式串中用到的“n”就是一个转义字符,其意义是“回车换行”。 转义字符主要用来表示那些用一般字符不便于表示的控制代码。 广义地讲,语言字符集中的任何一个字符均可用转义字符来表示。表2-2中的“ddd”和“xhh”正是为此而提出的。,“ddd”和“hh”分别为八进制和十六进制的ASCII代码。如“101”表示ASCII码为八进制“101”的字符,即为字符A。与此类似,“102”表示字符B,“134”表示反斜线,X0A表示换行。,例2.7 程序举例。 void main( ) int a,b,c; /* 定义 a、b、c为整数 */ a=5; b=6; c=7; printf(“%dnt%d%dn%d%dtb%dn“,a,b,c,a,b,c); 运行 5 67 5 6 7,例2.8 程序举例。 main( ) printf(“abctderftgn“); printf(“htibbjk“); ,f a b c g d e h j i k f g d e h j k,在打印机上得到以下结果 :,在显示屏上最后看道的结果与上述打印结果不同:,2. 字符变量 字符型变量用来存放字符常量,即单个字符。 每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。 不要以为一个字符变量中可以存放一个字符串。 字符变量的类型说明符是char。,将一个字符常量存放到一个变量中,实际上并不是把该字符本身放到变量内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。 例如字符“x”的十进制ASCII码是120,字符“y”的十进制ASCII码是121。对字符变量a、b赋予x和y值,实际上是在a、b两个单元内存放120和121的二进制代码:,a (ASCII 120) b (ASCII 121),0 1 1 1 1 0 0 0,0 1 1 1 1 0 0 1,例如: char a,b; /* 定义字符变量 a和b */ a=x,b=y; /* 给字符变量a和b分别赋值x和y*/,既然在内存中,字符数据以ASCII存储,它的存储形式与整数的存储形式相类似,所以也可以把它们看成是整型量。 语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。 在输出时,允许把字符数据按整型形式输出,也允许把整型数据按字符形式输出。 以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码当作整数输出。 也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。 整型数据为二字节量,字符数据为单字节量,当整型数据按字符型量处理时,只有低八位字节参与处理。,例2.9 程序举例。 main( ) char a,b; a=120; b=121; printf(“%c,%cn%d,%dn“,a,b,a,b); 运行 x,y 120,121,例2.10 程序举例。 main( ) char a,b; a=x; b=y; a=a-32; /* 把小写字母换成大写字母*/ b=b-32; /* 把小写字母换成大写字母*/ printf(“%c,%cn%d,%dn“,a,b,a,b); /* 以字符型和整型输出 */ 运行 X,Y 88,89,3. 字符串常量 字符常量是由一对单引号括起来的单个字符。 字符串常量是由一对双引号括起的字符序列。 例如:“CHINA“,“C program:“,“$12.5“等都是合法的字符串常量。可以输出一个字符串,如: printf(“Hello world!“); 字符常量与字符串常量容易混淆。a是字符常量,“a“是字符串常量,二者不同。假设c被指定为字符变量: char c; c=a; 是正确的,而c=“a“是错误的。c=“Hello“也是错误的。不能把一个字符串赋给一个字符变量。,C语言规定:在每一个字符串的结尾加一个字符串结束标记,以便系统据此判断字符串是否结束。C语言规定以字符“0”作为字符串结束标记。“0”是一个ASCII码为0的字符,也就是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。 如果有一个字符串“WORLD”,实际上在内存中是 它的长度不是5个字符,而是6个字符,最后一个字符为“0”。但在输出时不输出“0”。例如在printf(“WORLD“)中,输出时一个一个字符输出,直到遇到最后的“0”字符,就知道字符串结束,停止输出。,a和“a“究竟有什么区别呢? “a“实际包含两个字符,a和0,,一般来说,字符串常量和字符常量之间有如下的主要区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 (2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 (3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量。 (4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符“0”(ASCII码为0)。这是字符串结束的标志。,2.5 变量赋初值,C语言允许在定义变量的同时使变量初始化。 如: int a=3; /* 指定a为整型变量,初值为3 */ float f=3.56; /* 指定f为实型变量,初值为3.56 */ char c=a; /* 指定c为字符型变量,初值为a */ int a,b=2,c=5; /*指定a,b,c为整型变量,只对b、c初始化,b的初值为2,c的初值为5*/ 初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于有一个赋值语句。例如: int a=3; 相当于: int a; a=3;,2.6 数值型数据间的混合运算,整型、单精度型、双精度型数据可以混合运算。 前已述及,字符型数据可以和整型数据通用,因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。 例如: 10+a+1.5-12.34*b 是合法的。 在进行运算时,不同类型的数据要转换成同一类型,然后进行运算。 转换的方法有两种,一种是自动转换,一种是强制转换。,2.6.1 自动转换,假设 i 为整型变量, f 为单精度实型变量,d为双精度实型变量,e为长整型变量,有下面式子: 10+a+i*f-d/e,2.6.2 强制转换,其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果 强制转换成 类型说明符所表示的类型。 例如: (float) a 把a转换为实型, (int)(x+y) 把x+y的结果转换为整型。,例2.9 程序举例。 main( ) float f=5.75; printf(“(int)f=%d,f=%fn“,(int)f,f); 运行 (int)f=5,f=5.750000 分析 本例表明,f虽强制转为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为5(删去了小数),而f的值仍为5.75。,2.7 算术运算符和算术表达式,2.7.1 算术运算符,使用除法运算符“/”时,若参与运算的变量均为整数时,其结果也为整数(舍去小数);,2.7.2 算术表达式 用算术运算符、圆括号将运算对象(或称操作数)连接起来的符合C语法规则的式子,称为C算术表达式。其中运算对象可以是常量、变量、函数等。 例如: a*b/c-1.5+a 注意: C算术表达式的书写形式与数学中表达式有明显区别,在使用时要格外小心!,注意: C表达式中的乘号不能省略。 例如:数学式 , 相应的C表达式应写成:b*b-4*a*c。 C表达式中只能使用系统允许的标识符。 例如:数学式 相应的C表达式 应写成:3.1415926*r*r。 C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序。 例如:数学式 相应的C表达式 应写:(a+b)/(c+d)。, C表达式不允许使用方括号和花括号,只能使用圆括号帮助限定运算顺序。可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。 2.7.3 自增、自减运算符,+i和i+不同之处在于: +i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。 例如:i的初值等于3 j=+i; (i的值先变成4,再赋给j,j的值为4) j=i+; (先将i的值赋给j,j的值为3,然后i变为4) 综上所述,前置运算与后置运算的区别在于: 前置运算是变量的值首先加1或减1,然后再以该变量 变化后 的值参加其他运算。 后置运算是变量的值参加有关的运算,然后再将变量的值加1或减1,即参加运算的是变量 变化前 的值。,2.7.4 算术运算符的优先级、结合规律 (1)优先级 优先级是指当一个表达式中如果有多个运算符时,则计算是有先后次序的,这种计算的先后次序称为相应运算符的优先级。 (2)结合性 结合性是指当一个运算对象 两侧 的运算符的优先级别相同时,进行运算(处理)的结合方向。按“从右向左”的顺序运算,称为右结合性;按“从左向右”的顺序运算,称为左结合性。,-i+ , 因为“-”运算符和“+”运算符优先级相同,而结合方向为“自右至左”,即它相当于-(i+)。,2.8 赋值运算符和赋值表达式 2.8.1 赋值运算符与赋值表达式 赋值符号“=”就是赋值运算符,由赋值运算符组成的表达式称为赋值表达式。其一般形式为: 变量名=表达式 赋值的含义:将赋值运算符右边的表达式的值存放到以左边变量名为标识的存储单元中。 例如:x=10+y的作用是将10+y的值存放到以x为标识的存储单元中。 说明: 赋值运算符的左边必须是变量。例如,下面都是合法赋值表达式:x=10,y=x+10,y=func( ), 赋值符号“=”不同于数学中使用的等号,它没有相等的含义。例如:x=x+1,其含义是取出变量x中的值加1后,再存入变量x中去。 在一个赋值表达式中,可以出现多个赋值运算符,其运算顺序是从右向左结合。例如,下面是合法的赋值表达式: x =y=z=0 相当于 x=(y=(z=0) a=b=3+5 相当于 a=(b=3+5) 进行赋值运算时,当赋值运算符两边的数据类型不同时,将由系统自动进行类型转换。转换的原则是:赋值运算符右边的数据类型转换成左边的变量类型。,2.8.2 复合赋值运算符 其一般形式为: = 等价于: = 例如: n+=1 等价于 n=n+1 x*=y+1 等价于 x=x*(y+1), 复合赋值运算符的优先级与赋值运算符的优先级相同,且结合方向也一致。,包含复合

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论