第2章数据类型运算符表达式精.ppt
第第2章数据类型运算符表达式章数据类型运算符表达式第1页,本讲稿共72页主要内容主要内容v 2.1 C语言的数据类型 v 2.2 变量赋初值 v 2.3 各类数值型数据之间的混合运算 v 2.4 C语言的运算符与表达式 v 2.5 运算符的优先级和结合性 第2页,本讲稿共72页 2.1 C语言数据类型语言数据类型2.1.1 C语言的数据类型简介 著名计算机科学家沃思提出:程序数据结构算法第3页,本讲稿共72页 所以,存放数据的方式直接反映了一种语言的数据表达能力。数据的存储方式又称之为:数据类型。举 一个例子:以考生各科成绩及总分排队问题为列。成绩的存放 以数组形式 排队方法 算法2.1.1 C语言的数据类型简介第4页,本讲稿共72页数据有常量、变量之分,均为其中一种类型。本章先学习基本类型。基本类型构造类型指针类型空类型整型字符型实型单精度双精度数组结构体共用体枚举C数据类型丰富,分为:2.1.1 C语言的数据类型简介第5页,本讲稿共72页2.1.2 常量与变量常量与变量1 标识符标识符可用来命名变量,及作为常量名、函数名、数组名、可用来命名变量,及作为常量名、函数名、数组名、类型名、文件名等的有效字符序列类型名、文件名等的有效字符序列命名规则:命名规则:(1)由字母、数字、下划线组成且由字母或下划线开头,且一个程序内不得有重复名。一个程序内不得有重复名。如:_sum,sum,student_name,price等 第6页,本讲稿共72页(2)区分大小写。习惯上,变量名、函数名等用小写区分大小写。习惯上,变量名、函数名等用小写字母表示。常量名用大写字母表示(以增加可读性)。字母表示。常量名用大写字母表示(以增加可读性)。(3)标识符不能是关键字。标识符不能是关键字。另:需注意标识符长度,视不同系统而定。需注意标识符长度,视不同系统而定。设允许8个字符。则:student_ name,student_ number为同一名字。第7页,本讲稿共72页2 常量和符号常量常量和符号常量常量 程序运行过程中不能被改变的量。一般的数据显式写法均表示常量。如程序中:20 整型常量 15.8 实型常量 a 字符常量第8页,本讲稿共72页2 常量常量v一般用大写字母v是宏定义预处理命令,不是C语句直接常量:v整型常量:用数字表示,不带小数点 v实型常量:用小数点的数表示 v字符常量 v字符串常量如#define PRICE 30v定义:程序运行时其值不能改变的量(即常数)v分类:符号常量:用标识符代表常量v定义格式:#define 符号常量 常量例 符号常量举例(ch2_1.c)#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);运行结果:total=300第9页,本讲稿共72页&整型常量(整常数)v三种形式:十进制整数:由数字09和正负号表示.如 123,-456,0八进制整数:由数字0开头,后跟数字07表示.如0123,011十六进制整数:由0 x开头,后跟09,af,AF表示.如0 x123,0Xff例 12 与 12L例 30000 为int型 65536 为long int 型v整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母l或L,认为它是long int 型常量v在C程序中,只有十进制数可以是负数,而八进制和十六进制数只能是正数问题:0123 =()100 x123=()100Xff =()1083291255问题:0123 =()100 x123=()100Xff =()10第10页,本讲稿共72页&实型常量(实数或浮点数)v表示形式:十进制数形式:(必须有小数点)如0.123,.123,123.0,0.0,123.指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3,123E2,1.23e4,e-5 ,1.2E-3.5 v实型常量的类型默认double型在实型常量后加字母f或F,认为它是float 型在实型常量后加字母l或L,认为它是long double型第11页,本讲稿共72页例:#define PRICE 30 main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);还可用一个符号表示一个常量 符号常量第12页,本讲稿共72页符号常量(一般用大写,以区分变量)再如:=3.1415629#define PAI 3.1415629#define PRICE 30符号常量必须在使用前定义必须在使用前定义,采用预处理命令define。注意:用预处理命令定义符号常量不是语句,最后不写分号最后不写分号为什么使用符号常量?1.提高程序可读性 2.提高程序可维护性第13页,本讲稿共72页3 变量变量 程序执行中可以改变的量称为变量。变量包括变量名和变量值。变量名 用标识符命名,对应一定数量的内存存贮单元,其单元数视变量类型而定。C语言中,变量须先定义,后使用 如:int student;student=30;则若写成student=30,则未定义,编译时出错。第14页,本讲稿共72页 一旦变量被定义,即可在编译时为其分配相应数量的单元,其类型便确定。则可检查其运算的合法性。如:a%b 表示a整除以b的余,则a,b必须为整型量。变量中存放的只能是数据,且只能是一个数据。操作:操作:赋值赋值可以对同一个变量多次赋值,但变量的值是最后一次存放的数据。第15页,本讲稿共72页2.1.3 整型数据整型数据1 整型常量整型常量整型常量 整型常数C语言提供了三种形式:十进制 如:256,308,120等第16页,本讲稿共72页 八进制 以数字0开头表示的整数(无符号)例:0235,0146 等.0235=28238515710 014618248610210十六进制 以0 x开头的整型数 如:0 x16,0 x28第17页,本讲稿共72页分类:分类:分为四种:基本型、短整型、长整型、无符号型 2.短整型:类型说明符为:short int或 short 3.长整型:类型说明符为:long 或 long int 1.基本型:类型说明符为:int2 整型变量整型变量第18页,本讲稿共72页 4.无符号型:不存放符号,为不带符号数。又分为:上述各种类型所占内存单元数及取值范围视不同机器而不同。详见教材。(1)无符号基本型:类型说明符为unsigned int或unsigned;(2)无符号短整型:类型说明符为unsigned short;(3)无符号长整型:类型说明符为unsigned long 第19页,本讲稿共72页 定义方法定义方法 整型变量分别以下列方式定义2.短整型 short int 或 short a,b,c;3.长整型 long int 或 long a,b,c;1.基本整型:int a,b,c;第20页,本讲稿共72页4.无符号型 unsigned a,b,c;unsigned short a,b,c;unsigned long a,b,c;例:main()int a,b,c,d;/*指定a,b,c,d为整型变量*/unsignd u;/*指定u为无符号整型变量*/a=12;b=24;u=10;第21页,本讲稿共72页 c=a+u;d=b+u;printf(a+u=%d,b+u=%dn,c,d);由此看到:不同类型的整型数据可进行算术运算。但有一定规则,详见2.3。运行结果为 a+u=22,b+u=14第22页,本讲稿共72页 关于整型常量关于整型常量 程序中出现的整型常数,系统按以下规则分配变量(内存单元)或赋值给相应变量 2.若超越,而在21474836482147483647之间,则可赋给 long int 变量。1.当常数(量)在 3276832767之间,则可赋给int,long int 变量。第23页,本讲稿共72页4.一个非负整数,=,=,!=4.强制类型转换运算符:(类型)第40页,本讲稿共72页9.位运算符 ,|,&,.5.赋值运算符 =7.条件运算符?:8.逗号运算符 ,6.自增自减运算符 第41页,本讲稿共72页12.分量运算符 ,13.下标运算符 14.其它运算符 如函数的调用()10.求字节数运算符 size of 11.指针运算符 *,&第42页,本讲稿共72页 2.4.2 算术运算符和算术表达式算术运算符和算术表达式1 基本算术运算符+加法 正值 3+6,+3 减法 负值 6 4,5 乘法 38/除法 8/5%取模(求余)7%4 的值为3第43页,本讲稿共72页注:两个整型数据相除,结果为整数,商向下取整。5/3 1若除数和被除数中有一个 float型,则结果为double型。取模运算实际上是求余运算,其两个操作数必须是整数,结果与%符号左边的操作数相同。第44页,本讲稿共72页2 算术表达式及算术运算符的优先级与结合性运算对象:常量、变量、函数等优先级:(),/,%,+,结合性:同一优先级,自左向右,为左结合性,反之为右结合性。例:a b/c 1.5+ad e 当类型不同的数据进行运算时,按2.3介绍的方法进行类型转换。算术表达式:用算术运算符和括号将运算对象连接起来,且符合C语法规则的式子。第45页,本讲稿共72页3.3.各各类数数值型数据之型数据之间的混合运算的混合运算 C语言允许双精度、单精度、整型及字符数据之间混合运算 10+a+1.58765.1234 b是允许的。但有一个规则:先转换成同一类型,再计算。第46页,本讲稿共72页doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例 char ch;int i;float f;double d;ch/i +f*d -(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+a +i*f -d/l例 int i;float f;double d;long l;第47页,本讲稿共72页 2.4.3 强制类型转换符强制类型转换符利用强制类型转换运算符将一个算术表达式转换为所需类型一般形式:(类型名)(表达式)例如:(double)a 将a转换为double(int)(x+y)将x+y转换为int(float)(5%3)将5%3转换为float第48页,本讲稿共72页注:1.括号不能省略。如:intx 会理解为变量intx.2.转换后的类型数据由系统分配一个中间变量存放,而原变量类型不变。float x;又如:(int)(x+y)若省略:(int)x+y会变成将x转成整型.(int)x;则x本身仍为实型,而(int)x由一个中间变量存放x的整数部分。第49页,本讲稿共72页例:main()float x;int i;x=3.6;i=(int)x;printf(x=%f,i=%d,x,i);则:x=3.600000,i=3第50页,本讲稿共72页总结以上类型转换,有二种:1.强制另:强制类型转换运算优先于算术运算符.2.系统自动如:若x为float,则x%3不合法。但可用(int)x%3来解决。(附录III介绍了优先级)第51页,本讲稿共72页2.4.4 赋值运算符、赋值表达式2.整型数据赋给实型变量,数值不变,但按实数形式存放.1.将实型数据(无论单,双精度)赋给整型变量时,舍弃小数.赋值时,两边类型若不一致,则按以下规则转换:符号=为赋值运算符。1.赋值运算符第52页,本讲稿共72页4.将intlong int,进行符号扩展。即:符号扩展,低16位long 的低16位。5.long int int 则高16位截断。3.字符型数据赋给整型变量时:(2)字符带符号整型变量,则字符高位扩展。(1)字符无符号整型变量,则存入低8位,高8位补零。第53页,本讲稿共72页6.将unsigned int 型long int高位补0。原值传送,但数据大小不能超出取值范围。如:unsigned int a=65535;int b;b=a;则越界。而位数相同部分赋值 unsigned int int unsigned long long unsigned short short第54页,本讲稿共72页7.非unsigned 型长度相同的unsigned型数据,原样传送(包括符号位)第55页,本讲稿共72页一般形式:2.赋值表达式例:x=10 为一赋值表达式 其中又可以是一个赋值表达式。例:x=(y=10)相当于 y=10;x=y 由于赋值号为右结合性,于是()可省略,即为:x=y=10;由赋值运算符“”将一个变量和一个表达式连接起来的式子称为赋值表达式。第56页,本讲稿共72页2.4.4 自增自减运算符、负号运算符设有int i=3;+自增1 自减1则:+i,i+都会使i变为4,但有区别:+i:先使i值加1,再使用i值;i+:先使用i值,再使i值加1.j=+i;j=4,i=4.(i=i+1;j=i;)j=i+;j=3,i=4.(j=i;i=i+1)1.自增自减运算符第57页,本讲稿共72页同理:i,i ,均使i值1,但:又如:printf(i=%dn,i+);结果:i=3若:printf(i=%dn,+i);结果:i=4 i:先使i值减1,再使用i值;i :先使用i值,再使i值减1i=3;第58页,本讲稿共72页几点注意:+和 运算法只能用于变量,不得用于常量和表达式.+,的结合性为从右至左,而一般算术运算符为从左至右。如:如 5+,(a+b)+均为不合法.i+和+为同一优先级.i+相当于(i+)若 i=3,则结果为3,i为4.+,主要用于循环变量自增或自减。第59页,本讲稿共72页 要慎用+、运算符。有关表达式使用中的问题说明则:先对i进行3次自加,为6,然后三个i相加为18,而i为6。如:表达式(i+)+(i+)+(i+)(i=3)一般认为:从左至右:3+4+5=12,i6.但Turbo C.MSC 都是先取三个原值相加:i+i+i=9 i6如果表达式数为:k=(+i)+(+i)+(+i)第60页,本讲稿共72页 在表达式中,有的运算符为一个字符,有的为两个字符。在函数调用时,如:一般地:自左至右尽可能多地将若干字符组成一个运算符。例:i+j,究竟理解为(i+)+j还是i+(+j)?printf(%d,%d,i,i+);若i=3,若参数计算从左至右,则输出 3,3若从右至左,则输出4,3上述问题看似复杂,最好上机实践.第61页,本讲稿共72页2.负号运算符负号运算符“”是单目运算符,任何操作数前放置负号运算符相当于1乘以该操作数。第62页,本讲稿共72页2.4.6 逗号运算符和逗号表达式逗号运算符和逗号表达式 逗号运算符一般形式:表达式1,表达式2其计算规则:先计算表达式1,再计算表达式2,最后值为表达式2的值。例:a=35,a 4 则:先计算3 5,a15,a 4=60,结果为60。第63页,本讲稿共72页又如:(a=35,a 4),a+5 扩展形式:表达式1,表达2,表达式n,结果为20(作为逗号表达式的值)a+5a 即 20a.3 5=15a a 4=60 (此时a值仍未变)结果为表达式n的值 第64页,本讲稿共72页注意:x=(a=3,63)赋值表达式,x18;x=a=3,6 a 逗号表达式,x3.逗号表达式主要用于某些语句中需一次计算多个表达式值的情况。如在循环语句中。函数调用中的实参之间虽然用的是逗号间隔,但不是逗号表达式。如:printf(%d,%d,%d,a,b,c);第65页,本讲稿共72页1.位运算符C语言中共有六种位运算符:&(按位与)|(按位或)(按位异或)(按位求反)(按位右移)其中:求反()是单目运算符,且为右结合性,其他都是双目运算符,且为左结合性。位运算对象只能是整型(int)或者字符型(char)数据。2.4.7 位运算符、位运算表达式位运算符、位运算表达式第66页,本讲稿共72页按位逻辑运算符运算符:按位与&按位或|按位异或按位异或 按位求反按位求反运算规则:运算规则:0&0=00&1=01&0=01&1=10|0=00|1=11|0=11|1=1 00=001=110=111=00=1 1=0第67页,本讲稿共72页 位移位运算符 左移运算符:用来将一个数的各二进制位全部 左移若干位。一般使用形式:表达式1n如:a:00001111 a1:00011110 a:用来将一个数的各二进制位全部 右移若干位。一般使用形式:表达式1n如:a:00001111 a1:00000111 a2:00000011因此:右移可以缩小原数的倍数,右移1位,相当于原数除以2,右移n位,相当于原数除以2n。第69页,本讲稿共72页2.4.8 sizeof运算符、复合赋值运算符运算符、复合赋值运算符1.sizeof运算符 sizeof运算符经常用于动态分配。一般使用形式:sizeof(对象)对象可以是表达式或是数据类型名。功能:求出运算对象在计算机内存中所占用的字节数。例如:sizeof(char):求字符型在内存中所占用的字节数,结果为1。sizeof(6):求整型数据6在内存中所占用的字节数,结果为2。第70页,本讲稿共72页2.复合赋值运算符复合赋值运算符:在 号之前加一个其它运算符。C语言规定:凡是二目运算符均可构成复合运算符。例:a+=3;相当于 a=a+3 x=y+8;相当于 x=x(y+8)x%=3;相当于x=x%第71页,本讲稿共72页2.5 运算符的优先级和结合性在C语言中,运算符的优先级共有15级。1级最高,15级最低。在表达式求值时,先按运算符的优先级次序执行,当一个运算对象两侧的运算符优先级相同时,再按运算符的结合性处理。运算符的结合性有两种:左结合性(自左至右)和右结合性(自右至左)。多数运算符的结合性是左结合性的。也有少数运算符是右结合性的,如赋值运算符、自增、自减运算符等。C语言运算符的优先级和结合性见附录3。第72页,本讲稿共72页