数据类型常量变量表达式.pptx
回顾,算法、程序和软件是什么?程序设计基本过程包含哪些步骤?算法用程序语言写下来就得到程序。,从今天起,我们来学习写C+程序的种种规定。,第二章 数据类型与表达式,国防科大计算机学院 叶常春,内容提纲,数据类型常量和变量整型常量和变量浮点型常量和变量字符型常量和变量运算符和表达式,C+程序的“砖”和“瓦”,学习方法,学习与程序语言相关的概念,要问:是什么?有什么用?怎么用?好方法:阅读示例程序,熟悉新知识,然后模仿着写自己的程序。,C+程序示例,#define PRICE 30#include using namespace std;int main()int num,total;num=10;total=num*PRICE;couttotalendl;,本行定义了符号常量,本行定义了两个类型为整型的变量,这里的10是一个字面常量,这里使用了前面定义的符号常量,一、数据类型,1.数据类型,是什么:数学上,数分整数和实数等类型。与此类似,C+语言把程序所处理的数据分成多种类型。有什么用:声明变量时需要指定数据类型。它决定了:变量的取值范围。变量的值如何存储。可以施加于值之上的操作(比如求余操作不能施加于浮点数即数学上的实数)。,值:数的大小。,数据类型,基本类型,空类型(无值类型)void,构造类型,指针类型,整型(char,short,int,long),浮点型(float,double,long double),字符型(char),结构类型struct,数组类型,枚举型enum,联合型union,C+数据类型,布尔型(bool),括号内的英文词(逗号隔开)都是类型的名称。,1.数据类型,1.数据类型,怎么用?声明变量时使用(以后会用在其他场合),用法:如:int count;,类型名称 变量名称;,这是类型名称,这是变量名称,1.1 整型,整型对应于数学上的整数类型。C+语言中,整型分以下三种具体的类型:基本整型,以int作为名称。值用4字节存储;取值范围:-231 231-1短整型,以short int或short为名。值用2字节存储;取值范围:-215 215-1 长整型,以long int或long为名。值用4字节存储;取值范围:-231 231-1,1.2 浮点数类型,C+语言中的浮点数就是数学上的实数。浮点数类型分为三种(数值范围见46页表3-2):单精度(float)使用4个字节双精度(double)使用8个字节长双精度(long double)使用8字节,例:float x;double y;long double z;,存储长度越大,可存范围越大,精度越高的值,1.3 数据类型使用示例一,#define PRICE 30#include using namespace std;int main()int num,total;num=10;total=num*PRICE;cout“total=“totalendl;return 0;,本行定义了两个类型为整型的变量(用逗号隔开),程序执行时,将分别为变量num和total分配4个字节的存储空间,用于存储整数值。,1.3 数据类型使用示例二,现阶段,类型主要用在定义变量的时候,以后会用在其他场合。,/这里省略了部分代码int main()int count;double penPrice;/这里省略了部分代码,count在内存中占用几个字节?penPrice呢?怎么知道它们的存储长度?,二、常量,2.常量和符号常量,常量是什么:常量是在程序运行过程中不发生改变的数。常量有什么用:代表求解问题过程中固定不变的数,比如圆周率。常量分两种:字面常量和符号常量。,2.1 字面常量,字面常量是直接写在源程序中的数。,注意:上例给出了区分数值2与文字2的方法。,2.2 符号常量,符号常量是代表一个字面常量的名字。用#define命令行(不是语句)可以定义符号常量,如:#define PRICE 30,PRICE是符号常量,代表30。这意味着在程序中使用PRICE就等于使用30。,2.3 常量的使用示例,#define PRICE 30#include using namespace std;int main()int num,total;num=10;total=num*PRICE;cout“total=“totalendl;return 0;,本行定义了符号常量,这里的10是一个字面常量,这里使用了前面定义的符号常量,例 计算圆的周长和面积,2.4 符号常量的优点示例,/(省略)int main()int r=2;float s,l;l=2*3.14*r;s=3.14*r*r;coutl“,”sendl;,#define PI 3.14,PI,PI,3.14159,含义清晰,一改全改,三、变 量,3.变量,是什么:变量是程序运行过程中存储值的场所。变量代表内存中的一片存储区域(若干连续的字节)。有什么用:在所代表的存储区域中保存值。怎么用:先定义后使用(见下一幻灯片),称之为变量的值,3.变量怎么用?,C+语言要求变量使用之前一定要定义:,类型名称 变量名称;,int count;,类型名称(有什么用?),变量名称(取名有规定),变量count被赋值,内存中发生了什么?,取变量count的值,3.变量实质,int i,j;i=7;j=i;,7,7,系统为变量 i 和 j 分配的内存单元,,当变量在赋值号的左边,表示将赋值号右边计算出的数值放到左边变量所代表的内存单元中,当变量在赋值号的右边,表示将变量所代表的内存单元中的数值取出来参与表达式的运算,3.1 变量赋初值,取变量的值之前一定要初始化或赋值,否则会得到不可预测的值。变量初始化是在定义变量时可以给变量赋一个初值,例如:float a=3.0;或者,先定义变量,然后通过赋值语句给变量赋值,例如:float a;a=3;,以后使用就不会取到不可预测值。,3.2 变量的使用示例,#include using namespace std;int main()float penPrice=10.0;float ballPrice;/计算买2支笔,3个球的钱money=penPrice*2+ballPrice*3;cout“总价:”moneyendl;,程序中存在与变量使用有关的错误。修正错误,使其能正确运行。,四、字符型常量和变量文字的表示和存储字符类型、字符常量、字符变量字符串常量,4.1 文字的表示和存储,在计算机内,“How r u?”是怎么表示的呢?“你好”是怎么表示的呢?,基本思路是:为每个字符(西文或汉字)进行编码,在计算机内存储其编码。西文常用的是ASCII码(美国标准信息交换码)。中文常用的是国标码(中国)。,字符a的ascii码值为97,意味着在计算机内字母a存成97的八位二进制。,4.1 文字的表示和存储,“How r u?”在内存中怎么存储?答:依次存储字符H、o、w、空格、r、空格、u、?的ASCII码(各占一个字节)。相关内存片段如下。,实际存储为大写字母H的ASCII码72的八位二进制,空格的ASCII码32的八位二进制,4.1 文字的表示和存储,汉字的表示和存储与西文的处理类似为每个汉字编号,在计算机内存储编号。国标码是常用的编号方案,每个编号使用两个字节。“你好”两个字如何存储?,4.2 字符型,字符型的名字是char。使用如:char ch;字符型实际上是单字节的整型,常用来存储字符的ASCII码(整数值),因此叫做字符型。字符型的“数”包括:小写字母a,b,;大写字母A,B,数字0,1,2,3,4,5,6,7,8,9其它字符如+,-,*,(,),?,这些“数”称为字符,组成ASCII字符集。,4.3 字符变量,下面定义了一个字符变量c,并把a赋值给它:char c;c=a;,代表1个字节的存储区域,把字母a赋值给变量c,实际存储的是字母a的ASCII编码值97,4.4 字符型常量,字符型常量要区分写法、存法和实际含义。写法:源程序中,字符常量要用单引号括起来,如a,?。存法:内存中用一个字节存储字符常量的ASCII码,如a存为97的八位二进制。实际含义:一个文字符号。,4.5 字符常量和变量的使用示例一,int main()/2_2 int iA;/i和j是整型变量 iA=A;/将字符常量赋给整型变量 coutiA Bendl;/输出整型变量iA和B的值 char chA=A,chB=B;coutchA chBendl;int iTen=10;char chTen=10;/换行符 coutiTenchTeniTenendl;return 0;,4.5 字符常量和变量的使用示例二,int main()/2_3 char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;coutc1 c2endl;/输出?c1=0;c2=c1+5;/c2=?coutc1 c2endl;/输出?return 0;,ASCII码表中,小写字母的码值比对应的大写字母的码值大32。,4.6 字符串常量,程序中如何写一串文字?用字符串常量。写法:用双引号括起来的字符序列,如:”How are you?”。存储方法如下:用连续的字节依次存储各个字符的ASCII码;尾部追加一个字节存储空字符0(字节的8位都为0)。,4.6 字符串常量,问:”How are you?”一共占用多少字节?为什么要在字符串尾部加上空字符0?a和”a”是有什么区别?,13,标明字符串的结尾。,前者是一个字符,用1个字节存储。后者是一个字符串,用2个字节存储。,4.6 字符串常量使用示例,int main()/2_4 cout“he”endl;coutheendl;coutheendl;cout“你好”endl;cout“你”“好”endl;cout你好endl;return 0;,思考题,要在源程序中书写以下字符或字符串(括号内是说明),该写成什么?Im a student.Bob is a“dog”.(换行符)(空格)C+程序中,以下两两之间有什么区别?A与”A”,a与a,B与”B”,见“附录:转义字符”,五、表达式和运算符(概念上,与数学表达式和运算符类似),5.1 算术运算,int main()/2_5 int a=3,b,c;b=2*a;c=a+b*b;coutcendl;/输出?float f1=c/b,f2=c/6.0;coutf1 f2endl;/输出?b=c%a;/%是求余运算 coutbendl;/输出?,注意:两个整数相除,结果是整数。,赋值运算符,5.1 算术运算,现场编程题在以下代码中填写算术运算式子求得圆的周长和面积。(圆周率取3.14),int main()/2_6double r,length,area;cinr;/输入半径;/求圆周长;/求圆面积cout“周长:”lengthendl;cout“面积:”areaendl;,5.2 自增、自减运算符,/头部几行省略int main()int a=3,ahz,aqz;ahz=a+;cout ahz*ahz endl;/?aqz=-a;coutaqz*aqzendl;/?int b=3,c=0;b+=a+;c-=a+b;coutcendl;,自增运算(后置用法),自减运算(前置用法),5.2 自增、自减运算符,/头部几行省略int main()int a=3,ahz,aqz;ahz=a+;cout ahz*ahz endl;/?aqz=-a;coutaqz*aqzendl;/?int b=3,c=0;b+=a+;c-=a+b;coutcendl;,自增运算(后置用法)作用:对变量a增1。表达式a+的取值是变量a未增1前的值。用表达式a+参与赋值运算。,5.2 自增、自减运算符,/头部几行省略int main()/2_7 int a=3,ahz,aqz;ahz=a+;cout ahz*ahz endl;/?aqz=-a;coutaqz*aqzendl;/?int b=3,c=0;b+=a+;c-=a+b;coutcendl;,自减运算(前置用法)作用:对变量a减1。表达式-a的取值是变量a减1后的值。用表达式-a参与赋值运算。,5.2 自增、自减运算符,自增、自减运算符有四种应用格式:,注意:是把a+的结果赋给b,而不是把变量a的值赋给b。,5.3 复合赋值运算符,/头部几行省略int main()/2_7 int a=3,ahz,aqz;ahz=a+;cout ahz*ahz endl;/?aqz=-a;coutaqz*aqzendl;/?int b=3,c=0;b+=a+;c-=a+b;coutcendl;,复合赋值运算“+=“的作用:计算右边表达式的值 b=b+上述表达式的值,复合赋值运算“-=“的作用?,5.3 复合赋值运算符,5.4 运算符优先级和结合性,/头部几行省略int main()int a=3,ahz,aqz;ahz=a+;cout ahz*ahz endl;/?aqz=-a;coutaqz*aqzendl;/?int b=3,c=0;b+=a+;c-=a+b;coutcendl;,为什么先执行”+”而后执行+=,运算符有优先级:自增/自减 算术运算 赋值运算(括号可改变计算顺序),5.4 运算符优先级和结合性,/头部几行省略int main()/2_8int a,b,c;a=b=c=10;cout“a=“a“,b=“b“,c=“cendl;c=a+b+a+b;cout“c=“cendl;,=(赋值)自右向左结合,+(加法)自左向右结合,补充:C+语言的关键字,关键字是C+语言本身所使用的具有特殊含义的标识符。如:int,float,char,main,long等。关键字是C+语言专用的名字,程序中不要用来命名其他对象。,变量取名的规定标识符,C+语言规定,变量名、符号常量名等名字须使用标识符。标识符是满足以下条件的字符序列:只能由字母、数字和下划线三种字符组成;第一个字符必须是字母或下划线。C+语言是区分大小写的。因此,sum和Sum是两个不同的标识符。变量取名要有意义表达这个变量的用途。,总结,数据类型是什么,有什么用,怎么用?常量是什么,有什么用,怎么用?变量是什么,有什么用,怎么用?目前学习了哪些数据类型?学了哪些运算符?计算顺序?表达式是什么?,附录1,转义字符,说明:附录的内容相对次要。学习过程中先放在一边,待有余力或遇到相关问题时再来学习掌握。,特殊的字符常量转义字符,转义字符是特殊的字符。写法上,是以开头的字符序列,如:n。意义上,代表了一个特殊作用的字符。比如,n代表的是换行符,作用是表示一行结束。其他转义字符与此类似(见下表)。,一个字符常量,转义字符及其作用,附录2,类型转换,各类数值型数据间的混合运算,C+程序中,多种数值类型混合运算时,会把低级别类型(如short)的值转换为兼容的高级别类型(如long)的值,结果值也是高级别类型。类型转换指的是把一种类型(如short)的值转换为另一种类型(如long)的值。如果把高级别类型的值转换成低级别类型的值,则可能会产生偏差。如:int a=500;char ch=a;,编译器自动完成,ch存不了500,各类数值型的兼容关系,如果一种类型A的值转换为另一种类型B,不会产生偏差,则称类型B 兼容类型A。对于数值类型而言,可根据存储长度或取值范围来判别兼容与否。右表中,高级别的类型兼容低级别的类型。,附录3,强制类型转换逗号运算符,强制类型转换运算符,强制类型转换是把一个表达式的值从原类型A转换成类型B。强制类型转换的写法如下:(类型名)表达式特别注意:类型转换可能造成偏差!,int x;x=(int)5.3;,X的值是5,类型转换去掉了小数部分。,赋值操作的类型转换,强制类型转换归结为以下几条:等号右边的表达式的结果和左边的变量类型不一致时,将自动进行类型变换。高级别类型的值赋给低级别类型变量,可能产生误差。比如,浮点数值赋给整型变量,将舍弃小数点。负数赋值给无符号型变量,将变成正数。把超出变量的类型所限定的范围的值赋给变量将发生错误(即发生溢出)。,逗号运算符,逗号表达式的一般形式为:,表达式1,表达式2,表达式n,d=a+b,b+c,c+a;,(1)先求解,(2)再求解,(3)最后求解,附录4,溢出,程序示例:整型数据的溢出,int main()short a,b;a=32767;b=a+1;couta“,”bendl;,按理是32768,实际是-32768,溢出!,程序示例:整型数据的溢出(续),溢出指的是超出了表示范围。,例如,用3位存储十进制数,那么 999+1=?,按理是1000,实际是000,程序中,用二进制表示数,最高位是符号位。最高位为0,代表正数;为1,代表负数。,程序示例:浮点型数据的舍入误差,int main()float a,b;a=123456.789e5;b=a+20;cout a“,”bendl;,a的实际输出:12345678848.000000,原因:float型存储的十进制数最多7位有效数字。应该采用double型。,程序示例:浮点型数据的舍入误差(续),程序存储浮点数时,存储的是采用科学计数法之后的小数部分和指数部分,如下所示。,内部实际使用二进制表示,对float型而言,小数部分二进制的位数保证相对应的十进制数的头7位是准确的。,定义整型变量的修饰符,定义整型变量的形式是:,修饰符 类型名 变量名,unsigned或singed,可省略。,例:int aInt;/有符号基本整型unsigned short uShort;/无符号短整型long lInt;/有符号长整型,类型名是?,整型变量的定义和使用举例,#include using namespace std;int main()int a,b,c,d;/定义变量 unsigned int u;a=12;b=-24;u=10;/赋值给变量 c=a+u;d=b+u;/变量参与计算 cout“a+u=“c“,b+u=”dendl;,一行定义了4个变量,逗号隔开,结果是?,整型(续),定义整型变量时,可以加上修识符“unsigned”或“signed”,用来指定变量是“无符号类型”或“有符号类型”。,unsigned int uInt;/无符号signed short int shortInt;/有符号long sLong;,只存储正整数,存储正整数或负整数,等同于有符号,整型(续),无符号整型与有符号整型的差别在于取值范围不同。无符号整型只能取正整数,有符号整型既有正又有负。从存储角度看,区别在于有没有符号位。三种整型基础上区分有无符号,一共得到6种整型。Visual C+中它们的书写、存储字节数和取值范围见20页表2.1。(特别说明:用来表示其内部分书写时可以省略。),附录5 const常量,在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常量(constant variable)。例如,const int a=3;/a的值不能改变 a=4;,附录6 赋值表达式和运算符,赋值运算符“=”的用法:,变量=表达式;,K=3*(4+5);,(2)接着把表达式的值赋给变量K,附录6 赋值表达式和运算符,以下形式的式子构成赋值表达式。,左值 赋值运算符 表达式,能够存储值的对象,如变量。,赋值运算符或复合赋值运算符,