C++基本数据类型_第1页
C++基本数据类型_第2页
C++基本数据类型_第3页
C++基本数据类型_第4页
C++基本数据类型_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

C++语言与面向对象的设计第3章C++的根本数据类型贵州大学计算机科学系数据类型是不同形式的信息在内存中分配方式的根本约定,是构造程序的根底。常量、变量甚至函数都具有各自己的数据类型。1五种根本数据类型整型〔说明符为int〕字符型〔说明符为char〕浮点型〔说明符为float〕双精度型〔说明符为double〕空值型〔说明符为void〕3.1根本数据类型 除void类型外,其余四种根本类型的说明符之前还可以加上特定的修饰符形成扩展类型。整型和字符型前面可加上:signed〔有符号数〕或unsigned〔无符号数〕、long〔长型〕或short〔短型〕修饰,整型缺省为signed。当整型前面有修饰符出现时,可省略关键字int。例如:long为长整型双精度型前面可加上long来修饰。 float、double、longdouble统称为浮点类型〔实型〕。

注意char和int比较: char型和int型有时可理解为同一类,但又不能完全一样?2用修饰符形成的扩展类型答:因为字符在内存中是以ASCII码的形式存储的,而ASCII码值为整数〔一致〕,不一直在于所占的字节数。类型名字宽(字节)范围short[int]2–32768~32767signedshort[int]2–32768~32767unsignedshort[int]20~65535int4–2147483648~2147483647signed[int]4–2147483648~2147483647unsigned[int]40~4294967295long[int]4–2147483648~2147483647signedlong[int]4–2147483648~2147483647unsignedlong[int]40~4294967295char1–128~127signedchar1–128~127unsignedchar10~255float43.4E-38~3.4E+38(约7位有效数字)double81.7E-308~1.7E+308(约15位有效数字)longdouble103.4E-4932~1.1E+4932(约19位有效数字)void0无值表3.132位机上各根本类型的字宽及表示范围3.2常量同C++中其它数据一样,常量也具有一定的数据类型。常量的类型是由其书写形式决定。例如,45.28是浮点类型,370是整型,‘p’是字符型等。3.2.1整型常量 除十进制外,整型常量还可以用八进制、十六进制来表示。

十进制整型常量没有前缀,且不能以0打头。如:12八进制整型常量必须以0打头,其后由0~7之间的数字组成。如012、0375等。

十六进制整型常量以0x或0X打头,其后由0~9之间的数字和英文字母A~Z〔或a~z〕组成。如0x32、0xA8等。 整型常量的后面可加上后缀,以区分各种不同类型的整数。具体如下: 后缀为L〔或l〕,表示该常量为长整数〔longint型〕,如8739L、-584l; 后缀为U〔或u〕,表示该整型常量为无符号整数〔unsignedint型〕,如85U、20u; 后缀为L〔或l〕和U〔或u〕的组合,表示该常量为无符号长整数〔unsignedlongint型〕如6397LU、765Lu、4325lU、07656lu〔无符号八进制长整数7656〕等。如果整型常量的后面没有修饰符,C++编译器会将其类型解释为能存储该数的最小整型。3.2.2浮点常量浮点常量可以采用小数法和科学记数法表示。科学记数法常用于表示很大或很小的浮点数。如1.2E8〔即1.2×108〕、-5.7356E-9〔即-5.7356×10-9〕。浮点常量的整数局部和小数局部如果为零可以省去,但不可两者都省去。例如.34456.5.E3.89E2都是合法的数据。浮点常量可带后缀,以区分各种不同类型的实数。没有后缀,表示该浮点常量为双精度数〔double型〕,如75.23;后缀为F〔或f〕,表示该浮点常量为浮点数〔float型〕,如4.233F、-12.9f;后缀为L〔或l〕,表示该浮点常量为长双精度数〔longdouble型〕,如8.5l、2.07L。字符常量用引号括起来的单个字符称为字符常量。例如‘Y’、‘y’、‘6’、‘#’、‘’(空格)等。注意:其中的'Y'和'y'是两个不同的字符常量。转义序列〔escapesequences〕除了可显示字符之外,还有一些不可显示字符,用于产生某种控制操作,例如换行符、响铃符等。——转义序列来表示。转义序列有两种形式。一,转义字符,由一个反斜杠后跟一个字符来表示。二,是用一个反斜杠加上该字符的ASCII码来构成。其中字符的ASCII码可采用三位八进制数〔形如\ddd〕或两位十六进制数〔形如\xhh〕。例如,换行符的ASCII码为10〔八进制为12,十六进制为0A〕,那么可表示为'\012'或'\x0A';转义字符含义\a响铃\n换行符\r回车符\t水平制表符(tab键)\v垂直制表符\b退格符(backspace键)\\反斜线\'单引号\"双引号\?问号\f进页符(走纸)\0空字符(null)表3.2C++预定义的常用转义字符

3.2.4字符串常量字符串常量是用双引号括起来的字符序列。例如:"Howareyou.""请输入两个整数:"需要注意的是:双引号:是字符串的定界符,因此字符串本身所包含的双引号应该用其转义字符\"来表示。例如下面的语句:cout<<"\"Y\"or\"N\""<<endl;产生的输出为?:反斜杠加字符的ASCII码来表示的转义序列:C++将按最长有效长度对转义序列进行解释。例如,语句 cout<<"x\x34y"<<endl;中,由于'\x34'是字符'4'的转义序列,得到的输出为:x4y〔书上有误〕

"Y"or"N"字符常量可用字符型变量来存放,在内存中只占一个字节;字符串常量是用一维字符数组来存放,在内存中占多个字节。每个字符串除给定的字符序列外,都有一个结束符'\0'〔即ASCII码为0的“空字符”〕。A(a)'A'的存储形式B\0(b)"A"的存储形式ABC\0(c)"ABC"的存储形式图3.1字符常量与字符串常量的存储形式

符号常量常量除可以直接以其字面形式来表示〔如3.14159〕外,还可以用一个标识符来代替,用来代替常量的标识符称为符号常量。符号常量定义格式:1.用define定义:例:#definePI3.142.用const定义:const数据类型常量标识符=常量表达式; const数据类型常量标识符〔常量表达式〕;例如,下面这句constfloatpi=3.14159;或constfloatpi(3.14159);符号常量实际上是只读变量,由保存字const规定了它的值在程序中不能被改变。例如,下面的语句是非法的:constintx=10;……x=20;//非法3.3变量 变量是盛数的容器。 计算机中的变量是内存物理存储单元的抽象。

计算机变量的概念涉及以下四个方面:

变量名 变量类型 变量存储地址 变量的值变量的定义在C++中,变量必须先定义、后使用。

例如,语句 intx,y; charch;声明了两个整型变量x、y,一个字符型变量ch。有关变量的重要概念:变量的类型——变量的长度〔字节数〕变量存储地址变量名〔存储单元首地址的映射〕变量的值——存储单元中的内容。xych20002004200810变量可以在定义时初始化,给变量赋一个初值。例如:

inta=3,b=-78;doublearea=67.34;上述变量声明语句的执行可以分解为两个底层操作:

实例化+初始化C++提供另一种形式的初始化方法。例如,上面两个语句可改写为:

inta(3),b(-78);doublearea(67.34);

3.3.2变量的赋值变量值的改变通过赋值运算来完成。“=”是赋值运算符,它的左边只能是变量标识符,右边可以是常量、变量或表达式等。例如,对于已声明为int型的变量x,语句x=3+2*5;将表达式3+2*5的值13赋给x,即填入x的存储区域中。

值得注意的是,赋值运算符是从右到左结合的。例如表达式x=y=5;相当于y=5;x=y;3.4指针变量3.4.1指针的概念1.指针:即变量的内存地址。2.指针变量指针变量是一种特殊的变量:它存放的不是数据的值,而是另一个变量的地址。指针变量常常直接简称为指针。

指针的类型就是它所指向的那个变量的类型,有时也称为指针的基类型。指针本身通常是存放器变量,但也可以是存储器变量。当指针为存储器变量时,编译器也会为它分配一个内存单元。这时指针也有自己的存储地址。存放指针地址的变量称为指针的指针。6AF31204x_ptrx39.4986AF312047B016582图3.3指针与它所指向的变量……

指针的指针〔1〕.指针的定义和初始化指针同一般变量一样,在使用之前必须先定义。定义时要指明指针的类型,并在指针名前加类型修饰符*。定义指针的声明语句格式如下:类型*指针名;或者类型*指针名;其中,*是一个指针类型修饰符,不是变量名的一局部。例如:int*x_ptr;或者int*x_ptr; 定义了一个指向int型变量的指针x_ptr;而char*c_ptr;或者char*c_ptr; 定义了一个指向char型变量的指针c_ptr。需要注意的是,语句int*x,y;不是定义了两个int型指针x和y,而是定义了一个int型指针x和一个int型变量y。从防止混淆的角度看,用另一种格式int*x,y;更为适宜。

一个指针在定义以后,并不具体地指向某个变量,而只是确定了类型。可以对指针进行初始化,让它指向某个具体的变量。

“&”是取地址运算符,用在一个存储器操作数的前面,表示取存储器操作数的地址值。例如:

floatsalary;float*salary_ptr=&salary;就将指针salary_ptr初始化为变量salary的地址值,也即指向了具体的salary。salary_ptrsalary图3.4变量salary和指向salary的指针

〔2〕指针的赋值和引用

除了在指针定义时对它进行初始化外,还可以使用赋值运算来给指针赋以变量的地址值。例如:inta=-8978;int*p;p=&a;这里,p被赋值为变量a的地址。也可以将一个已被赋值的指针赋给另一个相同类型的指针。例如:doublea;double*x=&a,*y;y=x;这样一来,y就与x指向同一个变量a。注意:只有同类型的指针才能相互赋值。例如,假定有intcount=78;floatallowance=3.45E+2;int*c_ptr;float*a_ptr;那么c_ptr=&count;//合法a_ptr=&allowance;//合法c_ptr=&allowance;//非法a_ptr=&count;//非法c_ptr=a_ptr;//非法a_ptr=c_ptr;//非法空指针:

空指针是值为零的指针。 许多C++系统的函数库(如iostream.h、string.h)中都将空指针定义为名字NULL。除了“&”之外,C++还有一个关于指针的运算符“*”。“*”是取内容运算符,用在指针变量的前面,表示取指针所指向的存储单元的值。例如,假设有inta=90;int*a_ptr=&a;intx;那么x=*a_ptr;将把a_ptr所指的存储区域的内容,即变量a的值赋给x,那么变量x值为90。而*a_ptr=98;将98填入a_ptr所指的存储区域,即a的值被填为98。同理*a_ptr=*a_ptr+1;将a_ptr所指的存储区域的值加1,即a的值被加了1,与语句a=a+1;的效果一样。应当注意,指针变量的声明语句int*a_ptr=&a;与赋值语句*a_ptr=98;中的“*”的含义是不同的。声明语句中的:“*”是指针类型修饰符,用来说明a_ptr是指针变量;赋值语句中的“*”是取内容运算符,用来取指针变量的内容。二者不可混淆。而且,C++的乘法运算符也是“*”,与前面两者的含义也不相同。例3.2一个关于指针的例子。

#include<iostream.h>voidmain(){intx=50;int*x_ptr=&x;//x_ptr指向xcout<<"x="<<x<<endl;//输出x的值cout<<"*x_ptr="<<*x_ptr<<endl; //输出x_ptr所指单元的值cout<<"x_ptr="<<x_ptr<<endl; //输出x_ptr的值*x_ptr=100;cout<<"x="<<x<<endl;cout<<"*x_ptr="<<*x_ptr<<endl;cout<<"x_ptr="<<x_ptr<<endl;}程序的输出为:x=50*x_ptr=50x_ptr=0x0065FDF4x=100*x_ptr=100*x_ptr=0x0065FDF4#include<iostream.h>//例:给出程序的运行结果voidmain(){

inta;

int*aPtr;a=24; aPtr=&a;

cout<<"Theaddressofais"<<&a<<endl;cout<<"ThevalueofaPtris"<<aPtr<<endl; cout<<"Thevalueofais"<<a<<endl;cout<<"Thevalueof*aPtris"<<*aPtr<<endl<<endl; cout<<"&*aPtr="<<&*aPtr<<endl;cout<<"*&aPtr="<<*&aPtr<<endl; cout<<"*aPtr="<<&aPtr<<endl;}Thevalueofais24Thevalueof*aPtris24&*aPtr=0063FE00*&aPtr=0063FE00Theaddressofais0063FE00ThevalueofaPtris0063FE00&aPtr=0065FDF424…0063FE00……0063FE00aPtra0065FDF43.4.2指针运算除了前面介绍的“&”、“*”运算和赋值运算外,指针只能进行两种运算。一种是与整数相加或相减,另一种是在一定条件下,比方两个指针都指向同一个数组时,两个指针可以相减或相比较。关于后一种情况,将在下一节介绍数组时讨论。指针与整数进行的加、减运算,代表着指针在内存空间上、下移动。具体上移或下移的字节数与其类型密切相关。例如,假设在某字长为32的计算机中,一个int型数据占4个字节,如果有inta=78;int*x=&a;x初始化为指向变量a。在语句x=x+1;执行后,x中存放的地址值被加了4,指向变量a下面一个整数。同理,语句

x=x–1;执行后,x指向了上一个整数。其它类型的指针也一样。假定一个double型数据占8个字节,指针ptr已声明为double型变量,那么语句

ptr=ptr+2;执行以后,ptr中存放的值被加了16,ptr指向了原来所指数据之后的第二个数据。 在将指针加1或减1时,也可以使用C++的增1运算符++和减1运算符––。它们分别表示把变量的值加1和减1。 增1运算符〔或减1〕运算符的前缀形式和后缀形式的区别。 以增1运算符为例,后缀++是先取变量的值然后再将变量的值加1;前缀++是先将变量的值加1然后再取变量的值。所以有: intx=7,y=3,z; z=x++;//执行后,z=7,x=8 z=++y;//执行后,z=4,y=4 使用C++的增〔减〕1运算符,涉及与指针有关的操作时,应注意加减是发生在地址上还是发生在内容上。 例如:int*P;p++;//相当于p=p+1;地址加1,P指向下一个整型数据;而*p++;//相当于*p=*p+1;内容加1。 当++或––与*同时作用于指针时,同样应该注意运算的顺序。 例如:x=*p++;相当于x=*(p++);即先从当前地址中取值,然后将指针指向下一个数据。 又如:x=*++p;相当于x=*(++p);

先将地址加1,再取地址中的数据赋给x。 而x=++*p;

相当于x=++(*p);

表示先取p所指向的单元内的数据值,再将数据值加1后赋给x。#include<iostream.h>//例:给出程序的运行结果voidmain(){ inta[3]={24,30,8};

int*p; p=a; intx; x=*p++; cout<<x<<","<<*p<<endl; x=*++p; cout<<x<<","<<*p<<endl; x=++*p; cout<<x<<","<<*p<<endl;}24,308,89,93.5类型转换类型转换分为两种,一种是隐式转换,一种是强制转换。3.5.1隐式转换这是一种由系统自动进行的类型转换。⑴对于赋值运算,当赋值运算符“=”左、右两边的操作数为不同类型时,总是将右边表达式的类型转换为左边变量的类型,然后再赋给左边的变量。例如,对于以下语句:inta=89;doubleb=3.5;a=b;cout<<"a="<<a<<"b="<<b<<"\n";编译器先将b的值转换为int型,再赋值给a。但b的值在转换为int型时小数局部将丢掉,因此将导致警告信息。以上程序段的输出为:a=3b=3.5类型转换并不改变b本身的类型,b仍然为double型。例3.3分析下面程序的运行结果。

#include<iostream.h>voidmain(){intx; charch='a';//字符'a'的ASCII码为97x=ch+200; cout<<"x="<<x<<"\n";cout<<"ch="<<ch<<"\n";cout<<"ch+200="<<ch+200<<"\n";}

⑵short型、signedshort型、和所有的char型的数据在运算前将无条件转换成int型的数据。例3.3中,在做加法时,ch先被转换成int型数据97,再与200相加。此程序的输出为:

x=297ch=ach+200=297例3.4分析下面程序的运行结果。#include<iostream.h>voidmain(){charstring[]="hello";char*p=string;cout<<string<<endl;cout<<p<<endl;cout<<*p<<*(p+1)<<*(p+2)<<*(p+3)<<*(p+4)<<endl;cout<<*p<<*p+1<<*p+2<<*p+3<<*p+4<<endl;}程序的输出为:hellohellohello在最后一个输出语句中,*p的值是字符'h',但在作加法之前将会先转换为int型,即字符'h'的ASCII码104,因此*p+1的值为105,依此类推。//特例:指针指向字符串首地址时的输出⑶除以上⑴、⑵种情况外,如果一个二元运算符左、右两边的操作数的类型不同,那么将值域〔即取执范围〕较小的类型向值域较大的类型转换。值域较小者称为低类型,值域较大者称为高类型。运算结果的类型同高类型一样。类型按由高到低的顺序依此是:int、unsigned、long、unsignedlong、float、double、longdouble例如,下面程序段intx=5; doubley=89.6;cout<<"x+y="<<x+y<<"\n";中,二元运算符+号左边的int型的x将先被转换为double型的值,再与右边的double型的y相加。程序段的输出是:x+y=94.6⑷在函数调用时,实参总是先转换成形参的类型;在函数有返回执值的调用中,假设return后面的表达式的类型与该函数的类型不一致,那么总是将此表达式强制转换为函数的类型。需要指出的是,由于隐式转换是由编译器完成的,在程序中反映不出来,有时侯丧失数据也不易觉察,因此应尽量防止隐式转换。在需要用不同类型的数据进行混合运算时,最好使用强制转换。隐式转换举例如果有inti,j;charch;floata,b;doublex,y;longdoublew;那么有:表达式表达式的类型i+a*bx*(b/j+i)ch+ix=ch+i(x+y+j)–w/xch+'a'floatdoubleintdoublelongdoubleint3.5.2强制转换强制转换是指在程序中将某种类型的数据强制性地转换为另一类型,而不必遵循隐式转换中的规那么。强制类型转换的形式有如下两种:类型名(表达式)或者(类型名)表达式例如:(float)i或float(i)将把变量i转换成float型。强制转换举例假设同前面一样,有inti,j;charch;floata,b;doublex,y;longdoublew;那么有:表达式表达式的类型(int)(a+w)(int)a+w+b(double)ch–ij*(float)x/y这里需要注意的是,表达式(int)a+w是将a的值转换为int型后与w相加,而(int)(a+w)是将表达式a+w的值转换成int型。intlongdoubledoubledouble3.5.3类型转换时要注意的问题在进行类型转换时一定要特别小心,否那么可能会出现预料之外的结果,比方以下几种情况:⑴高类型转换为低类型时。这时数据的精度要受到损失,是不平安的转换。请看下例例3.5工资在原有根底

温馨提示

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

评论

0/150

提交评论