c程序设计-第三章数据类型、运算符、表达式.ppt
第三章第三章 数据数据类型、运算符、表达式型、运算符、表达式2.1 C的数据类型的数据类型一个程序包括两方面的内容:一个程序包括两方面的内容:1、数据描述、数据描述 2、操作步骤、操作步骤 数据结构数据结构+算法算法=程序程序程序程序=算法算法+数据结构数据结构+程序设计方法程序设计方法+语言工具和环境语言工具和环境数据类型数据类型 基本类型基本类型 整型(整型(int)字符型(字符型(char)实型(浮点型实型(浮点型float)单精度型(单精度型(float)双精度型(双精度型(double)枚举类型枚举类型 构造类型构造类型 数组类型数组类型 结构体类型结构体类型 共用体类型共用体类型 指针指针常量和常量和变量量2.2.1 常量和符号常量常量和符号常量 常量:在程序运行常量:在程序运行过程中,其程中,其值不能改不能改变的量。的量。整型常量整型常量12、0、3 实型常量型常量4.6、-12.3 字符常量字符常量a、b 字符串常量字符串常量-“COMPUTER”、“YOU ARE A BOY”符号常量符号常量用用标示符代表一个常量示符代表一个常量例例2.1#define price 30#include void main()int num,total;num=10;total=num*price;printf(“total=%d”,total);说明:程序中用说明:程序中用#define命令行定义命令行定义price 代表常量代表常量30,此后凡在此文中出,此后凡在此文中出 现的现的price都代表都代表30,和常量一样,和常量一样 运行。运行。注:符号常量在其作用域(主函数)内不能改变,也不能赋值注:符号常量在其作用域(主函数)内不能改变,也不能赋值。变量量变量:量:值可以可以变的量。的量。(一个(一个变量量应该有一个名字,在内存中占据一定的存有一个名字,在内存中占据一定的存储单元,并元,并 在在该单元中存放元中存放变量量值。)。)scanf(“%d,%d”,&a,&b);变量名为变量名为a的内存单元的内存单元注:注:1、为变量命名时应注意变量名的合法性;、为变量命名时应注意变量名的合法性;2、再、再C语言中大写字母和小写字母被认为是两个不同的字母语言中大写字母和小写字母被认为是两个不同的字母 (sum、SUM););3、再、再C语言中变量名的长度不能超过语言中变量名的长度不能超过8个字符(个字符(student_name、student_number);4、C语言中要求对所有用到的变量作强制定义,也就是语言中要求对所有用到的变量作强制定义,也就是“先定先定义,后使用义,后使用”。#include void main()int a,b,sum;a=123;b=456;sum=a+b;printf(“sum is%d”,sum);目的:目的:1、每个变量被指定为已确定的类型,在编译时就可以为其分、每个变量被指定为已确定的类型,在编译时就可以为其分配相应的存储空间。配相应的存储空间。2、每一个变量属于一个类型,就便于在编译、每一个变量属于一个类型,就便于在编译 时据此检查变量时据此检查变量进行的运算是否合法。进行的运算是否合法。a=12.2#include void main()int a,b;a=123;b=456;int sum;sum=a+b;printf(“sum is%d”,sum);#include void main()a=123;b=456;int a,b,sum;sum=a+b;printf(“sum is%d”,sum);整型数据整型数据2.3.1 整型常量整型常量 1、十、十进制整数制整数 123、-456、0 2、八、八进制整数制整数,以,以0(零)开(零)开头的数是八的数是八进制整数。制整数。0123=(123)8 -011=-(11)8 3、十六、十六进制整数,以制整数,以0X开开头的是十六的是十六进制整数。制整数。0X123=(123)16 -0X123=-(123)16整型变量整型变量 书书P41 变量的定义:类型说明符变量的定义:类型说明符 变量名变量名1,变量名,变量名2 int a,b long int c,d 实型数据型数据实型常量型常量 1、十、十进制制实型数据:型数据:0.123、123.00、0.0 2、指数型、指数型实数:数:123e3=123E3=123*1022实型变量实型变量 实型变量实型变量 单精度实数(单精度实数(float):内存中占四个字节,单精度数):内存中占四个字节,单精度数 共有共有7位有效数。位有效数。双精度实数(双精度实数(double):内存中占八个字节,并提供):内存中占八个字节,并提供 1516位有效数字。位有效数字。变量的定义:类型说明符变量的定义:类型说明符 变量名变量名1,变量名,变量名2 float num1,num2double a;a=111111.111;float b;b=1111.11;float c;c=111111.1 11 ;注:实型常量不分注:实型常量不分float、double,一个实型常量可以赋给一个单精度变量也可一个实型常量可以赋给一个单精度变量也可 以赋给一个双精度变量,根据变量类型截取常量中的有效数位。以赋给一个双精度变量,根据变量类型截取常量中的有效数位。字符型数据字符型数据字符型常量字符型常量 1、用、用单引号括起来的引号括起来的单个字符。个字符。a、b、?2、特殊形式的字符常量,就是以一个、特殊形式的字符常量,就是以一个“”的字符系列。的字符系列。特殊字符特殊字符功能功能n换行换行t横向跳格(即跳到下一个输出区一个输横向跳格(即跳到下一个输出区一个输出区占出区占8列,列,18、916v竖向跳格竖向跳格b退格退格r回车(不换行回车,即跳到当前行的第回车(不换行回车,即跳到当前行的第一列)一列)f走纸换页走纸换页反斜杠字符反斜杠字符“”单引号字符单引号字符ddd1到到3位位8进制数所代表的字符进制数所代表的字符“双引号符号双引号符号xhh1到到2位位16进制数所代表的字符进制数所代表的字符main()printf(“ab ct derftgn”);printf(“htibbj k”);ab c de第第9列列当前行的第一列当前行的第一列fgh i _j ik字符字符变量量(占内存空占内存空间为1个字个字节)字符字符变量(量(char):用来存放字符常量。):用来存放字符常量。(注:只能存放一个字符,(注:只能存放一个字符,该字符在字符在书写写时应用用单引号括起来,引号括起来,不能存放字符串)不能存放字符串)char c1,c2;c1=a;c2=b;字符数据在内存中存储形式以及使用方法字符数据在内存中存储形式以及使用方法将一个字符常量存放到一个字符变量中去,实际上并不是把该字符本身存放将一个字符常量存放到一个字符变量中去,实际上并不是把该字符本身存放到内存单元中去,而是把该字符相应的到内存单元中去,而是把该字符相应的ASCII码存放到存储单元中。码存放到存储单元中。char c1,c2;c1=a;c2=b;C1 97C2 98C1 01100001C2 01100010字符数据的存储方式和整数的存储形式类似,一个字符既可以以字符形式输字符数据的存储方式和整数的存储形式类似,一个字符既可以以字符形式输出(输入),又可以以该字符的出(输入),又可以以该字符的ASCII码作为整数输出(输入)。码作为整数输出(输入)。#include void main()char c1,c2;c1=97;c2=98;printf(“%c,%c”,c1,c2);printf(“%d,%d”,c1,c2);a b 97 98c1=a;c2=b;小写字母转换为大写字母小写字母转换为大写字母#include void main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c,%c”,c1,c2);A B字符串常量字符串常量字符串:有一对双引号括起来的字符序列。字符串:有一对双引号括起来的字符序列。“how do you do”“CHINA”“$123.34”printf(“”$234.34”);“a”和和 a有何区别?有何区别?“a”:a oC规定:当字符串被存放在内存中时,计算机会自动的在每一个字符串的结尾加规定:当字符串被存放在内存中时,计算机会自动的在每一个字符串的结尾加 一个字符串结束标记一个字符串结束标记“0”,以便系统据此判断字符串是否结束。,以便系统据此判断字符串是否结束。a:a注:注:1、“0”为空操作符,它不引起任何空操作符,它不引起任何动作,也不是一个可作,也不是一个可显示的字符,在写字示的字符,在写字符符 串串时不必加不必加“0”,因因为“0”是系是系统自自动加上的。加上的。2、c语言中没有言中没有专门的字符串的字符串变量,字符串如需放在量,字符串如需放在变量中,需用字符型数量中,需用字符型数组来存放。来存放。char a;a=“c”;char a;a=c;数据类型数据类型 基本类型基本类型 整型整型 字符型字符型 实型(浮点型)实型(浮点型)单精度型单精度型 双精度型双精度型 枚举类型枚举类型 构造类型构造类型 数组类型数组类型 结构体类型结构体类型 共用体类型共用体类型 指针指针int 2字节字节 c char 1字节字节 float 4字节字节double 8字节字节2.6变量定义变量定义 数据类型数据类型 变量名表;变量名表;int a,b,c;float d;注:注:1、变量名表之间的变量用逗号分隔。、变量名表之间的变量用逗号分隔。2、不能有变量定义的二义性。、不能有变量定义的二义性。#include void main()int a,b,c;char a,cha;#include void main()char c1,c2;c1=97;c2=98;printf(“%c,%c”,c1,c2);3、变量名属于标示符,一般用小写字母、变量名属于标示符,一般用小写字母(不能与关键字相同)不能与关键字相同)4、程序中变量是按名引用的。给变量取名一般应考虑变量所表示的量的、程序中变量是按名引用的。给变量取名一般应考虑变量所表示的量的 含义和使用目的,以提高程序的可读性。含义和使用目的,以提高程序的可读性。5、对变量的定义,一般是放在一个函数的开头部分。、对变量的定义,一般是放在一个函数的开头部分。2.7变量赋初值变量赋初值 C程序中的变量不仅必须先定义再使用,而且表达式中的程序中的变量不仅必须先定义再使用,而且表达式中的变量必须变量必须具有确定的值具有确定的值。让变量具有确定的值,可以给变量赋值,也可以给变量。让变量具有确定的值,可以给变量赋值,也可以给变量赋初值,或从键盘给变量输入值。赋初值又叫初始化,即在定义变量的赋初值,或从键盘给变量输入值。赋初值又叫初始化,即在定义变量的同时给变量赋值。同时给变量赋值。1、程序中为变量赋值、程序中为变量赋值#include void main()int a,b,sum;a=90;sum=a+b;printf(“sum=%d”,sum);2、可以在定、可以在定义变量量时同同时使使变量初始化量初始化#include void main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c,%c”,c1,c2);#include void main()char c1=a,c2=b;c1=c1-32;c2=c2-32;printf(“%c,%c”,c1,c2);#include void main()char c1=a,c2;c2=b;c1=c1-32;c2=c2-32;printf(“%c,%c”,c1,c2);错:错:int a=b=c=4;对:对:int a=4,b=4,c=4;数据数据类型与表达式型与表达式变量(量(值可以可以变的量)的量)变量的量的4要素:要素:名称名称 类型型 长度度 值intcharfloatdouble:变量声明时计算机自动为它划分一定大小的内存空间:变量声明时计算机自动为它划分一定大小的内存空间 变量的声明:类型名变量的声明:类型名 变量名变量名1、变量名、变量名2、;char name1,name2;:变量名:变量名=表达式;表达式;(将一个常量的值赋予一个变量)将一个常量的值赋予一个变量)name1=a;name2=97;将一个字符常量存放到一个字符变量中去,实际将一个字符常量存放到一个字符变量中去,实际上并不是把该字符本身存放到内存单元中去,而上并不是把该字符本身存放到内存单元中去,而是把该字符相应的是把该字符相应的ASCII码存放到存储单元中。码存放到存储单元中。各类数值型数据的混合运算各类数值型数据的混合运算整数、实数(单精度、双精度)、字符型数据可以混合运算整数、实数(单精度、双精度)、字符型数据可以混合运算10+a+1.5-8765.1234*b在运算时,不同类型的数据先转换为同一类型数据在运算时,不同类型的数据先转换为同一类型数据。double floatlongunsignedint char、short高高低低图中横向向左的箭头表示必定转换。图中横向向左的箭头表示必定转换。纵向箭头表示当运算对象类型不同时各类型数据的转换方向。纵向箭头表示当运算对象类型不同时各类型数据的转换方向。10 +a +I *f -e /d(假设假设I为整型变量,为整型变量,f、d为双精度型数据,为双精度型数据,e为长整型)为长整型)double*doubledouble*double97+107(int)107.00000(double)+double-double赋值时的的类型型转换1、将、将实型数据(包括型数据(包括单精度数据、双精度数据)精度数据、双精度数据)赋给整型整型变量量时,舍弃小数部分。舍弃小数部分。int i;i=3.14;printf(“”i=%d”,i);i=32、将整型数据赋给单精度、双精度数据时,数值不变,但以浮点数、将整型数据赋给单精度、双精度数据时,数值不变,但以浮点数型是存放到变量中型是存放到变量中。float f;f=23;23.000003、字符型数据赋给整型变量时,由于字符只占一个字节,而整型变、字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为两个字节,因此将字符数据放到整型变量的低量为两个字节,因此将字符数据放到整型变量的低8位中。位中。(1)如果所用系统将字符处理为无符号的量,则将字符的)如果所用系统将字符处理为无符号的量,则将字符的8位放位放到整型变量到整型变量 的低的低8位而高位补位而高位补0。int i;i=376;11 11 11 1000 00 00 00 11 11 11 10(2)如果所用系统将字符处理为带符号的量,若字符高位为)如果所用系统将字符处理为带符号的量,若字符高位为0,则整型变量,则整型变量 高高8位补位补0;若字符最高位为;若字符最高位为1,则高,则高8位全补位全补1。符号扩展符号扩展int i;i=376;11 11 11 1011 11 11 11 11 11 11 10-24、将、将带符号的整型数据(符号的整型数据(int)赋给长整型整型变量量时,要,要进行符号行符号扩展。如果展。如果int数据数据为正正值,则长整型整型变量高位量高位补0,如果,如果int型型变量量为负值(符号位(符号位为1),),则长整型高位整型高位补1,将,将int型数据的型数据的16位位数据送数据送长整型低整型低16位中。反之,若将一个位中。反之,若将一个长整型数据整型数据赋给一个一个int型型变量,只将量,只将长整型数据中低整型数据中低16位原封不位原封不动送到整型送到整型变量。量。int a;long int b=8;a=b;0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 10 0000 00 00 00 00 00 10 00a:b=65536;a=b;printf(“a=%d”,a);0 0 00 00 00 00 00 00 01 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00a:a=0算算术运算和算运算和算术表达式表达式运算符运算符简介介1、算术运算符、算术运算符 (+、-、*、%)2、关系运算符、关系运算符 (、=、=、!、!=)3、逻辑运算符、逻辑运算符 (!、(!、&、|)4、位运算符、位运算符 (、|、&)5、复制运算符、复制运算符 (=)6、条件运算符、条件运算符 (?、(?、:)7、逗号运算符、逗号运算符 (,)(,)8、指针运算符、指针运算符 (*,&)9、求字节数运算符、求字节数运算符 (sizeof)10、强制类型转换运算符、强制类型转换运算符 (类型符)(类型符)11、下标运算符、下标运算符 ()12、分量运算符、分量运算符算算术运算符和算运算符和算术表达式表达式一、基本的算一、基本的算术运算符运算符 +*/%(莫运算复或取余运算符)(莫运算复或取余运算符)1、/:两个整数相除:两个整数相除结果果为整数。整数。5/3=1 -5/3=?运算类型运算类型运算符运算符名称名称例子例子运算功能运算功能双双目目运运算算符符+加加a+b求求a与与b的和的和减减a-b求求a与与b的差的差*乘乘a*b求求a与与b的积的积/除除a/b求求a除以除以b的商的商%取余取余a%b求求a除以除以b的余数的余数单目单目运算符运算符+自增自增a+或或+aa的值加的值加1 自减自减a或或aa的值减的值减1取负取负a求求a的负数的负数(如果除数或被除数中有一个值为负数,则舍入方向不固定(如果除数或被除数中有一个值为负数,则舍入方向不固定-1、-2)2、%:要求两侧数据均为整数。:要求两侧数据均为整数。二、运算符的优先级与结合性二、运算符的优先级与结合性A*b/c-1.5+a 先乘除后加减,从左到右的运算方式先乘除后加减,从左到右的运算方式三、可以利用强制转换符将一个表达式转换为所需类型。三、可以利用强制转换符将一个表达式转换为所需类型。/数据数据 (double)a (将(将a转换为转换为double)(int)(x+y)(将(将x+y的值转换为的值转换为int)(int)x+y (将(将x转换为转换为int在和在和y相加)相加)%:float%int=(int)float%int#include void main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);x=3.600000,i=3不能写成不能写成(double)(x)四、自增、自减运算符(作用是四、自增、自减运算符(作用是变量增一或减一)量增一或减一)i=1+i、i=i-1+i、-ii+、i-在引用在引用i之前,先使之前,先使i的值加一(减一)的值加一(减一)在引用在引用i之后,使之后,使i的值加一(减一)的值加一(减一)#include void main()int i,j1,j2;i=9;j1=+i;j2=i+;printf(“+i=%d;i+=%d”,j1,j2);i=i+1;j1=i 先增值,后引用先增值,后引用j2=i;i=i+1 先引用,后增值先引用,后增值+i=10,i+=9#include void main()int i=0;printf(“+i=%d”,+i);1#include void main()int i=0;printf(“i+=%d”,i+);0注:注:1、自增运算(、自增运算(+)自减运算()自减运算(-)只能用于)只能用于变量,不能用于表达式、常量。量,不能用于表达式、常量。5+错错错错(a+b)+5=5+1(a+b)=(a+b)+12、+、-的结合方式是的结合方式是“从从右右到到左左”i=3;-i+-(i+)(-i)+对对数据数据类型与表达式型与表达式关系运算和关系运算和逻辑运算运算关系运算关系运算(比较运算比较运算)六种关系运算符:六种关系运算符:、=、=(等于)(等于)、!=(不等于)(不等于)优先级相同优先级相同优先级相同优先级相同高高低低算术运算算术运算关系运算关系运算赋值运算赋值运算高高低低例:例:C A+B A B!=C A=B C等效于:等效于:C(A+B)等效于等效于:(AB)!=C等效于:等效于:A=(BC)关系表达式关系表达式用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连结起来的式子。赋值表达式、字符表达式)连结起来的式子。Ab、a+b(b=5)、)、a=c、(ab)(bb a+b(b=5)a=c(ab)(b5&109|35)&(109)|(36&5=7 !(S=H)!4 值为值为 0A=1,S=7 A|S 值为值为 1!A|S 值为值为 12、用来对逻辑型数据进行各种逻辑运算,产生逻辑结果、用来对逻辑型数据进行各种逻辑运算,产生逻辑结果(真、假)。真、假)。1、&:若两侧值都为真则值为真;若两侧值都为真则值为真;|:若两侧值一个为真则值为真;:若两侧值一个为真则值为真;!:求反。:求反。例:例:5 3&2|8 4-!013-00&0|有一数有一数 X 满足以下条件:满足以下条件:3X=100A&B0(X3&X=100练习1、以下程序段的、以下程序段的输出分出分别是什么?是什么?1)int x=8;int y=-5;printf(“%d%dn”,x+,y+);printf(“%d%dn”,x-,y-);2)int x=8;int y=-5;printf(“%d%dn”,+x,+y);printf(“%d%dn”,-x,-y);2、假定、假定x的的值的等于的等于100,问在在执行以下四个行以下四个语句的句的过程中,程中,x的的值和和表达式的表达式的值分分别怎怎样变化?化?x的的值 表达式的表达式的值 x+x x-x赋值表达式表达式一、复合的复一、复合的复值运算符运算符 在在赋值符符“=”加上其它运算符,可以构成复合的运算符。加上其它运算符,可以构成复合的运算符。+=、%=a+=3 (a=a+3)x*=y+8 (x=x*(y+8)x%=3 (x=x%3)目的:目的:简化程序,是程序化程序,是程序简练,提高,提高编译效率。效率。凡二元运算符,都可以与凡二元运算符,都可以与赋值符一起符一起组合成复合合成复合赋值符(符(10)。)。+=、-=、*=、/=、%=、&=、二、二、赋值表达式表达式 由由赋值运算符将一个运算符将一个变量和一个表达式量和一个表达式连接起来的式接起来的式值称称为“赋值表达式表达式”。a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)a+=a-=a*aa=a+(a-a*a)逗号运算符逗号运算符逗号表达式:用逗号逗号表达式:用逗号连接起来的表达式。(接起来的表达式。(3+6,8+5)一般形式:表达式一般形式:表达式1,表达式,表达式2求解求解过程:先求表达式程:先求表达式1的的值,再求表达式,再求表达式2的的值。整个逗号表达式的。整个逗号表达式的值为表达式表达式2的的值。a=3*5,a*4 a=(z=3*5,z*4),z+5 6020注:逗号运算符的在所有运算符中的运算级别最低。注:逗号运算符的在所有运算符中的运算级别最低。并不是任何地方出现的逗号都作逗号运算符。并不是任何地方出现的逗号都作逗号运算符。printf(“%d,%d,%d”,a,b,c);