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

下载本文档

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

文档简介

第二章 数据类型、运算符与表达式 C语言A 基本内容 2.1 C的数据类型 2.2 常量与变量 2.3 整型数据 2.4 实型数据 2.5 字符型数据 2.6 变量赋初值 2.7 各类数值型数据间的混合运算 2.8 算术运算符和算术表达式 2.9 赋值运算符和赋值表达式 2.10 逗号运算符和逗号表达式 C语言A 基本要求 v掌握C语言的数据类型和各种数值型数 据之间的混合运算。 v掌握C语言的各种运算符和表达式。 C语言A 本章重点与难点 v重点:基本数据类型,变量的概念,运 算符和表达式。 v难点:变量的数据存储形式,进制转换 ,数据类型转换。 C语言A 本章作业 C语言A 【例2.0】计算圆的面积,半径为 5 cm。 #include void main( ) float r r, , areaarea ; ; r r=5 5 ; ; areaarea=3.143.14*r r*r r; ; printf (“%fn “, areaarea) ; 运算结果是输出运算结果是输出圆的面积:圆的面积:78.50000078.500000 程序如下: C语言A 2.1 C的数据类型 vC语言提供了以下一些数据类型: 数据类型数据类型构造类型构造类型 指针类型指针类型 * * 空类型(空类型(无值类型)无值类型) voidvoid 枚举类型枚举类型 enumenum 数组类型数组类型 结构类型结构类型 structstruct 联合类型联合类型 unionunion 基本类型基本类型 整型整型 intint 字符型字符型 charchar 实型(浮点型)实型(浮点型) 单精度实型单精度实型 floatfloat 双精度实型双精度实型 doubledouble C语言A 2.2 常量与变量 v对于基本数据类型量,按其取值是否可 改变又分为常量和变量两种。 v在程序执行过程中,其值不发生改变的 量称为常量,其值可变的量称为变量。 v可与数据类型结合起来分类。 v在程序中,常量是可以不经说明而直接 引用的,而变量则必须先定义后使用。 C语言A v常量区分为不同的类型: 一、常量和符号常量 整型常量:100,125,-100,0 实型常量:3.14 , 0.125,-3.789 字符常量:a, b 符号常量:用标识符表示上面的几种直 接常量(字面常量) C语言A v标识符:用来标识变量名、符号常量名、函 数名、数组名、类型名、文件名的有效字符序 列。 v符号常量:在C语言中,可以用一个标识符 来表示一个常量,称之为符号常量。 v符号常量在使用之前必须先定义,其一 般形式为: #define 标识符 常量 C语言A v习惯上符号常量的标识符用大写字母, 变量标识符用小写字母,以示区别。 v符号常量与变量不同,它的值在其作用 域内不能改变,也不能再被赋值。 v使用符号常量的好处是: 含义清楚,“见名知意”; 需要修改时,能做到“一改全改”。 C语言A #define PRICE 30 #include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); 【例2.1】符号常量的使用。 运行结果:total=300 vv说明:说明:如再 用赋值语句给 PRICE赋值是错 误的。 vPRICE=40; /* 错误,不能 给符号常量赋 值。 */ C语言A v变量代表内存中具有特定属性的一个存储单 元,它用来存放数据,这就是变量的值,在程 序运行期间,这些值是可以改变的。 v变量名实际上是一个以一个名字对应代表一 个地址,在对程序编译连接时由编译系统给每 一个变量名分配对应的内存地址。从变量中取 值,实际上是通过变量名找到相应的内存地址 ,从该存储单元中读取数据。 二、变量 a 变量名 3变量值 存储单元 C语言A 每个变量都必须有一个名字变量名,变量命 名遵循标识符命名规则。 变量命名的规定:语言规定标识符只能由字母 、数字和下划线三种字符组成,且第一个字符必须为 字母或下划线。 例: sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123, 3D64, ab C语言A 注意: v编译系统将大写字母和小写字母认为是两 个不同的字符。 v建议变量名的长度最好不要超过8个字符。 v在选择变量名和其它标识符时,应注意做 到“见名知意”,即选有含意的英文单词 (或其缩写)作标识符。 v要求对所有用到的变量作强制定义,也就 是“先定义,后使用” 。 C语言A 2.3 整型数据 v十进制:没有前缀,数码为09 237、-568、65535、1627;023 、23D v八进制:前缀为0,数码为07,无符号 015、0101、0177777;256、03A2、-0127 v十六机制:前缀为0X或0x,数码为09, AF或af 0X2A、0xA0 、0XFFFF; 5A, 0x3H 一、整型常量(整常数) C语言A v各种进制之间的转换 二进制、八进制、十六进制转换成十进制: 按权相加 C语言A 二进制、八进制、十六进制转换成十进制: 连续除以基,从低到高记录余数,直至商为0。 例 把十进制数59转换成二进制数 592 292 142 72 32 12 0 (59)10=(111011)2 1 1 0 1 1 1 1 1 1 0 1 1 余 余 余 余 余 余 C语言A 例 把十进制数159转换成八进制数 1598 19 8 2 8 0 (159)10=(237)8 2 3 7 余 7 余 3 余 2 例 把十进制数459转换成十六进制数 45916 2816 116 0 (459)10=(1CB)16 1 C B 余11 余12 余 1 C语言A v整型常数的后缀:在16位字长的机器上,基 本整型的长度也为16位,因此表示的数的范围 也是有限定的。十进制无符号整常数的范围为0 65535,有符号数为-32768+32767。八进 制无符号数的表示范围为00177777。十六进 制无符号数的表示范围为0X00XFFFF或0x0 0xFFFF。如果使用的数超过了上述范围,就 必须用长整型数来表示。长整型数是用后缀“L” 或“l”来表示的。 v无符号数也可用后缀表示,整型常数的 无符号数的后缀为“U”或“u”。 C语言A v数据在内存中是以二进制形式存放的。 二、整型变量 int i; i=10; 0000000000001010 i 10 150 i C语言A v数值是以补码表示的: v正数的补码和原码相同; v负数的补码:将该数的绝对值的二进制形式按位取 反再加1。 例如:求-10的补码补码 。 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 取反: 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 再加1,得-10的补码补码 : 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 由此可知:左面的第一位是表示符号的。 10的原码码: 150 C语言A 1)基本整型(类型关键字为int)。 2)短整型(类型关键字为short (int))。 3)长整型(类型关键字为long (int))。 v根据占用内存字节数的不同,整型变量分为3 类: C语言A 注意:括号表示其中的内容是可选的。 共六种 有符号基本整型 有符号短整型 有符号长整型 无符号基本整型 无符号短整型 无符号长整型 (signed)int (signed)short (int ) (signed) long (int) unsigned int unsigned short (int) unsigned long (int) v有符号整型和无符号整型一起共有6类: C语言A v整数类型的有关数据: 类型 类型说明符 长度 数的范围 基本型 int 2字节 -3276832767 短整型 short 2字节 -215215-1 长整型 long 4字节 -231231-1 无符号整型 unsigned int 2字节 065535 无符号短整型 unsigned short 2字节 065535 无符号长整型 unsigned long 4字节 0(232-1) C语言A 变量说明的一般形式为: 类型说明符 变量名标识符,变量名标识符,.; int a,b,c; (a,b,c为整型变量) long x,y; (x,y为长整型变量) unsigned int p,q; (p,q为无符号整型变量 ) v整型变量的定义 C语言A 【例2.2】 整型变量的定义与使用。 #include void main() int a,b,c,d; /* 指定、为整型变量 * unsigned ; * 指定为无符号整型变量 * a12;-24;10; c; printf(,); 运行结果:, C语言A v整型数据的溢出 #include void main() int a,b; a=32767; b=a+1; printf(“%d,%dn”,a,b); 运行结果:32767,-32768 说明:数值是以补码表 示的。一个整型变量只 能容纳-3276832767 范围内的数,无法表示 大于32767或小于- 32768的数。遇此情况 就发生“溢出”。 C语言A 2.4 浮点型数据 两种表示形式 小数 指数 0.123 3e-3 注意:字母e(或E)之前必须有数字,且e后面的 指数必须为整数: 1e31e3、1.8e-31.8e-3、-123e-6-123e-6、-.1e-3-.1e-3 e3e3、2.1e3.52.1e3.5、.e3.e3、e e 一、浮点型常量 C语言A 在字母e(或E)之前的小数部分中,小数点左 边应有一位(且只能有一位)非零的数字。 例如: 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e 其中的1.23456e3称为“规范化的指数形式” 。 v规范化的指数形 式 C语言A 一个浮点型数据一般在内存中占4个 字节(32位)。与整型数据的存储方式不 同,浮点型数据是按照指数形式存储的 。系统把一个浮点型数据分成小数部分 和指数部分,分别存放。指数部分采用 规范化的指数形式。 二、浮点型变量 v浮点型数据在内 存中的存放形式 C语言A 类型 位数 数的范围 有效数字 float 32 10-37 1038 67 位 double型 64 10-30710308 1516位 long double 128 10-4931104932 1819位 浮点型变量分为单精度(float型)、双精度(double 型)和长双精度型(long double)三类形式。 v浮点型变量的分类 C语言A 【例2.3】浮点型数据的舍入误差。 #include void main() float a,b; a=123456.789e5; b=a+20; printf(“%fn”,b); 运行结果: 123456.789e5 说明:一个浮点型变量只能保证 的有效数字是7位有效数字,后 面的数字是无意义的,并不准确 地表示该数。应当避免将一个很 大的数和一个很小的数直接相加 或相减,否则就会“丢失”小的 数。 C语言A C编译系统将浮点型常量作为双精度来处理。 例如:f = 2.45678 * 4523.65 系统先把2.45678和4523.65作为双精度数, 然后进行相乘的运算,得到的乘也是一个双精 度数。最后取其前7位赋给浮点型变量f。如是 在数的后面加字母f或F(如1.65f, 654.87F), 这样编译系统就会把它们按单精度(32位)处 理。 v浮点型常量的类型 C语言A 2.5 字符型数据 (1)用单引号包含的一个字符是字符型常量 (2)只能包含一个字符 a,A, 1 abc、“a” 一、字符型常量 C语言A C语言还允许使用一种特殊形式的字符常量,就 是以反斜杠“ ”开头的转义字符。 v转义字符 n t v b r f ddd xxh 功能 换行 横向跳格(即跳到下一个输出区) 竖向跳格 退格 回车 走纸换页 反斜杠字符“ ” 单引号(撇号)字符 1到3位8进制数所代表的字符 1到2位16进制数所代表的字符 字符形式 C语言A 二、字符型变量 v字符变量的类型关键字为char,一般占用1字 节内存单元。 v字符变量用来存储字符常量。将一个字符常 量存储到一个字符变量中,实际上是将该字符 的ASCII码值(无符号整数)存储到内存单元 中。可作为整数和字符两种形式输出,可对字 符进行整数运算( ASCII码值)。 v字符可以是字符集中任意字符。但数字作为 字符型参与数值运算时数字的值就不是它的 ASCII值。 C语言A 【例2.4】向字符变量赋以整数。 #include void main() char c1,c2; c1=97; c2=98; printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); 运行结果: a.b 97,98 说明:在第和第4行中 ,将整数和分别 赋给c1和c2,它的作用相 当于以下两个赋值语句: c1a; c2b; 因为a和b的ASCII码 为97和98。 C语言A 【例2.5】大小写字母的转换。 #include void main() char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(“c c,c1,c2); 运行结果: A.B 说明:程序的作用是将两 个小写字母a和b转换成大 写字母A和B。从 代码表中可以看到每一 个小写字母比它相应的大 写字母的码大 。语言允许字符数 据与整数直接进行算术运 算。 C语言A 说明:说明: 有些系统(如Turbo C)将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值 范围是-128127。如果在字符变量中存放一个ASCII码 为0127间的字符,由于字节中最高位为0,因此用%d 输出字符变量时,输出的是一个正整数。如果在字符变 量中存放一个ASCII码为128255间的字符,由于在字 节中最高位为1,用%d格式符输出时,就会得到一个负 整数。 C语言A 三、字符串常量 v字符串常量是用一对双引号括起来的若干字 符序列。 vC语言规定:在存储字符串常量时,由系统 在字符串的末尾自动加一个0作为字符串的结 束标志。 va是字符常量,而“a”是字符串常量。 v不能将一个字符串赋给一个字符变量。 vC中没有字符串变量,需要用字符数组存放 字符串。 C语言A v例如,“How do you do.”、“Good morning.” 等,都是字符串常量,其长度分别为14和13( 空格也是一个字符)。 v如果反斜杠和双引号作为字符串中的有效字 符,则必须使用转义字符。 例如:(1)C:msdosv6.22 “C:msdosv6.22” (2)I say:“Goodbye!“ “I say:“Goodbye! “ “ C语言A 2.6 变量赋初值 (1)语言允许在定义变量的同时使变量初始化。 如: int a=3; /* 指定为整型变量,初值为 */ float f=3.56; /* 指定为浮点型变量,初值为 .56 */ char c= a; /* 指定为字符变量,初值为 a*/ C语言A (2)可以使被定义的变量的一部分赋初值。 如: int a,b,c=5; 表示指定、 为整型变量,但只对初始化,c的初值为 (3)如果对几个变量赋以同一个初值, 应写成:int a=3,b=3,c=3; 表示、 、的初值都是。 不能写成 int a=b=c=3; 注意:初始化不是在编译阶段完成的而是在程序运 行时执行本函数时赋初值的,相当于有一个赋值语句 。 C语言A 2.7 各类数值型数据间的混合运算 u整型、单精度型、双精度型数据可以混合 运算。 u不同类型的数据要先转换成同一类型,然 后进行运算,即“先转换,后运算”。 u转换的方式有两种:自动转换(隐式转换 )和强制转换 C语言A 自动转换发生在不同类型数据进行混合运算时, 由编译系统自动完成。 隐式转换规则如图: 箭头只表示转换方向 ,并不是依次转换。 转换过程是自动完成 的。 一、隐式转换 C语言A 强制转换是通过类型转换运算符来实现。 一般形式:(类型说明符)表达式 功能:把表达式的结果强制转换为类型说明符所表 示的类型。 (int)a 将a的结果强制转换为整型量。 (int)(x+y) 将x+y的结果强制转换为整型量。 (float)a+b 将a的内容强制转换为浮点数,再与b相加 注意:无论隐式转换,强制转换都是临时转换,不 改变数据本身的类型和值。 二、强制转换 C语言A 例:强制类型转换 main() float f=5.75; printf(“(int)f=%dn“,(int)f); /* 将f的结果强制转换为 整型,输出 */ printf(“f=%fn“,f); /* 输出f的值 */ 结果: (int)f=5 f=5.750000 C语言A 2.8 算术运算符和算术表达式 v运算符:狭义的运算符是表示各种运算的符号。 vC语言运算符丰富,范围很宽,把除了控制语句和 输入/输出以外的几乎所有的基本操作都作为运算符处 理,所以C语言运算符可以看作是操作符。 vC语言丰富的运算符构成C语言丰富的表达式(是运 算符就可以构成表达式)。 v在C语言中除了提供一般高级语言的算术、关系、 逻辑运算符外,还提供赋值运算符,位操作运算符、 自增自减运算符等等。甚至数组下标,函数调用都作 为运算符。 C语言A 一、运算符类别 C语言A 二、C中各类运算符的优先级 初等运算符( )、 、 单目运算符!、+ +、 、+ 、 、(类型) 算术运算符、/ 、% ,+、 关系运算符、= ,= =、! = 逻辑运算符 ; i的值先变成4, 再赋给,i、j的值均为 ; 先将 i的值3赋给,的值为,然后变为 C语言A 注意: (1)自增运算符(),自减运算符( ),只能用于变量,而不能用于常量或 表达式; (2)和的结合方向是“自右至左” 。 自增(减)运算符常用于循环语句中使循 环变量自动加。也用于指针变量,使指 针指向下一个地址。 C语言A (6) 有关表达式使用中的问题说明 ANSI C并没有具体规定表达式中的子表达式的求 值顺序,允许各编译系统自己安排。 例如:对表达式 a = f1( )+f2( ) 并不是所有的编译系统都先调用f1( ), 然后 调用f2( )。在有的情况下结果可能不同。有时会出 现一些令人容易搞混的问题,因此务必要小心谨慎。 C语言A C语言中有的运算符为一个字符,有的运算 符由两个字符组成,为避免误解,最好采 取大家都能理解的写法。 例如:不要写成i+j的形式,而应写成 (i+)+j的形式。 C语言A 在调用函数时,实参数的求值顺序,C标准 并无统一规定。 例如:i = 3: printf (“%d,%d“, i, i+); 在有的系统中,从左至右求值,输出“,”。 在多数系统中对函数参数的求值顺序是自右而左 , printf函数输出的是“,”。以上这种 写法不宜提倡, 最好改写成: j = i+; printf(“%d,%d“,j,i); 不要写出别人看不懂的也 不知道系统会怎样执行的 程序! C语言A 2.9 赋值运算符和赋值表达式 符号“ = “为赋值运算符。 一、赋值运算符 作用:将一个数据赋给一个变量。 如:a = 8 C语言A 2. 整型数据赋给实型变量,数值不变,但按实数形式 存放. 1. 将实型数据(无论单,双精度)赋给整型变量时,舍弃 小数. 赋值时,两边类型若不一致,则按以下规则转换: 3. 字符型数据赋给整型变量时: (2)字符带符号整型变量,则字符高位扩展。 (1)字符无符号整型变量,则存入低8位,高8位补零。 C语言A 4. 将intlong int, 进行符号扩展。 即: 符号扩展, 低16位long 的低16位。 5. long int int 则高16位截断。 6. 非unsigned 型长度相同的unsigned型数据,原样 传送(包括符号位) C语言A 7. 将unsigned int 型long int高位补0。 (2)原值传送,但数据大小不能超值。 如: unsigned int a=65535; int b; b=a; 则越界。 (1)而位数相同部分赋值 unsigned int int unsigned long long unsigned short short C语言A 复合赋值运算符:在“ “号之前加一个其它 运算符。 C语言规定:凡是二目运算符均可构成复合运算符。 例: a+=3; 相当于 a=a+3 x=y+8; 相当于 x=x (y+8) x%=3; 相当于x=x%3 二、复合赋值运算符 C语言A 一般形式: 三、赋值表达式 赋值表达式的求解过程: v先计算赋值运算符右侧的“表达式”的值 v将赋值运算符右侧“表达式”的值赋值给左侧的 变量。 v整个赋值表达式的值就是被赋值变量的值。 C语言A 说明: v(1) 赋值运算符左边必须是变量,右边可 以是常量、变量、函数调用或常量、变量、 函数调用组成的表达式。 例如:x=10 y=x+10 y=func()都是合法的 赋值表达式。 v(2)赋值符号“=”不同于数学的等号,它没 有相等的含义。(“=”相等)例如:C语言中 x=x+1是合法的(数学上不合法),它的含义 是取出变量x的值加1,再存放到变量x中。 C语言A v(3)赋值运算时,当赋值运算符两边数据类型 不同时,将由系统自动进行类型转换。 转换原则:先将赋值号右边表达式类型转换为左 边变量的类型,然后赋值。 v(4)C语言的赋值符号“=”除了表示一个赋值操 作外,还是一个运算符,也就是说赋值运算符完成 赋值操作后,整个赋值表达式还会产生一个所赋的 值,这个值还可以利用。 C语言A 例: x=10 为一赋值表达式 其中又可以是一个赋值表达式。 例: x=(y=10) 相当于 y=10;x=y 由于赋值号为右结合性,于是“ ( ) “可省略, 即为:x=y=10; 又: a=5+(c=6) c=6, a=11 a=(b=4)+(c=6) b=4, c=6, a=10 a=(b=10)/ (c=2)b=10,c=2, a=5 C语言A 例: a + = a =aa

温馨提示

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

评论

0/150

提交评论