第二章第一节数据类型和表达式.docx
- 文档编号:11464302
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:39
- 大小:58.18KB
第二章第一节数据类型和表达式.docx
《第二章第一节数据类型和表达式.docx》由会员分享,可在线阅读,更多相关《第二章第一节数据类型和表达式.docx(39页珍藏版)》请在冰豆网上搜索。
第二章第一节数据类型和表达式
第二章C++语言基础
§2.1数据类型和表达式
一、基本数据类型
1.整形:
int
2.字符型:
char
3.浮点型(实型):
float(单精度)
double(双精度)
longdouble(长精度)
4.空值型:
void,用于函数和指针
4种修饰符:
signed—有符号
unsigned—无符号
long—长型
short—短型
都适用于整形和字符型;long还适用于双精度浮点型。
表2.1C++的基本数据类型P23
说明:
(1)【int】可以省略,即在int之前有修饰符出现时,可以省去关键字;
(2)char型和各种int型统称为整数类型。
二、常量和变量
1.常量在程序中不被改变的量。
(1)整形常量:
1)十进制:
由0~9的10个数字组成,例:
56,702等;
2)八进制:
以o为前缀,其后由0~7的数字组成,
例:
o76,o123等;
3)十六进制:
以ox或OX为前缀,其后由0~9的数和A~F的字母组成(大小写均可),例:
ox7A,OX8ef等。
整形常量中的长整形用L(或l)作后缀表示,例:
327675L,4793l;
整形常量中的无符号型用U(或u)作后缀表示,例:
327675U,4793u;
(2)浮点型常量:
只有十进制表示
组成:
整数部分+小数部分
表示方法:
·小数表示法:
5.,.25,4.07等
·科学计数法:
3.2E-5,5.7e10等
(3)字符常量:
表示方法:
用单引号括起来,例:
‘A’,‘+’‘’等;
转义序列表示:
\n(回车),\r(换行)等。
见表2.2(P25)
(4)字符串常量:
例:
“Thisisastring.”
“abcdef\n”
“\tabc\txya!
\\——续行标志
mnp\tefg!
”
字符常量与字符串常量的区别:
字符常量
字符串常量
用单引号括起;例:
‘A’
用双引号括起;例:
“abcdef”
在内存中,占一个字节;
在内存中,占多个字节;
具有加、减法运算;
例:
‘A’+‘B’+1
不具有加、减法运算。
(5)符号常量:
例:
pi——3.1415926;
定义方法:
constintsize=80;将size定义为符号常量,并初始化。
2.变量
定义:
在程序执行中,其值可以改变的量。
三要素:
名字,类型,值
(1)变量的名字按标识符的规定来命名变量。
注意:
·系统规定的保留字(关键字)不可作为变量名、函数名、类型名等使用;
·“见名知意”,有助于记忆,增加可读性;
·用多个单词构成的名字,常用下划线来分割单词或中间单词的第一个字母用大写,如:
is_byte或isByte;
·变量名字一般常用小写字母。
(2)变量的类型每种变量都应该具有一种类型,在定义或说明变量时要指出其类型。
·基本类型
·构造类型
(3)变量的值
·变量所表示的数据值
·变量的地址值
例:
charc;
c=‘a’;变量c被赋值后,在内存中对应存在着一个内存地址值,地址中存放着一个C的值。
(4)变量的定义
任何一个变量在引用之前必须定义。
与C语言不同之处:
C++可以在程序中随时定义变量,不必集中在执行语句之前。
格式:
<类型><变量名>
例:
inta,b,c;inta(3);<=>inta=3;
doublex,y,z;
说明:
·在同一个程序块内,不可以定义同名变量,在不同的程序块内,可以定义同名变量;
·在定义变量时可以给变量赋初始值,即初始化。
例:
intsize=100;
doublef=3.65;
charc='a';
三、数组类型
数组是一种构造类型,是数目固定、类型相同的若干变量的有序集合。
1.数组的定义
格式:
<类型><数组名>[<大小1>][<大小2>]…
例:
inta[3];
charb[3][5];
floatc[3][5][7];
可以用符号常量来指定数组的大小。
例:
constintsize=80;
intm[size];
2.数组的赋值
(1)数组元素的表示:
格式:
<数组名>[<下标表达式1>][<下标表达式2>]…
<下标表达式>——常量,从0开始,在内存中按下标的升序顺序连续存放。
1)一维数组:
例:
inta[5];a[0],a[1],a[2],a[3],a[4]
2)二维数组:
例:
intb[2][3];6个元素
b[0][0],b[0][1],b[0][2],
b[1][0],b[1][1],b[1][2]
(2)数组元素赋初值:
数组元素的个数≥初始值表中数据项的个数
1)一维数组:
例:
inta[5]={1,2,3,4,5};
inta[4]={5,4};a[0]=5,a[1]=4,a[2]=0,a[3]=0
2)二维数组
例:
intb[2][3]={{1,2,3},{4,5,6}};
或:
intb[2][3]={1,2,3,4,5,6};
intb[2][3]={{1,2},{3}};b[0][0]=1,b[0][1]=2,b[1][0]=3,其余为0
(3)数组元素的赋值
直接赋值:
例:
intm[3];
m[0]=1;m[1]=2;m[2]=3;
用循环语句:
例:
inta[10];
for(inti=0;i<10;i++)
a[i]=i*2+1;
赋值结果:
a[0]=1,a[1]=3,a[2]=5,…,a[9]=19.
3.字符数组
例:
chars1[4]={‘a’,‘b’,‘c’,‘d’};
s1——一维数组,四个元素分别是一个有效字符
chars2[5]={‘a’,‘b’,‘c’,‘d’,‘\0’};
s2——一维数组,是一个字符串,它存放着字符常量“abcd”。
初始化为字符串的简单方式:
chars2[5]=“abcd”;s2[0]=‘a’,s2[1]=‘b’,s2[2]=‘c’,
s2[3]=‘d’,s2[4]=‘\0’.
chars2[5]=“abcde”;这种初始化不正确,因为字符串的结束符“\0”是系统自动加上的.
可以用如下格式:
chars3[]=“abcde”;
四、枚举类型
枚举是一种构造的数据类型,是若干个有名字的整形常量的集合。
1.枚举模式的定义
格式:
enum<枚举名>{<枚举表>};
例:
enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
说明:
day—枚举名,枚举表中有7个枚举符
枚举符的值:
·默认情况下,最前边一个为0,后一个是前一个值加1
·显示赋值:
定义时直接赋值;
·隐式赋值:
按默认值。
例:
enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};
Sun=7,Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6
2.枚举变量的定义
格式:
enum<枚举名><枚举变量名表>;
例如:
enumdayd1,d2,d3;
d1,d2,d3是属于枚举名为day的枚举变量,它们的值就是上面枚举表中规定的7个枚举符之一。
enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2,d3;
enumcolor{RED,BLUE,YELLOW,BLACK,WHITE};
enumcolorc1,c2,c3;c1,c2,c3是三个具有color枚举名的枚举变量。
3.枚举变量的值
枚举变量的值是该枚举变量所属的枚举模式的枚举表的某一个枚举符。
例:
d1=Sum;
d2=Mon;
c1=RED;
c2=BLUE;
上述给枚举变量的赋值都是正确的。
而下面的赋值是错误的:
d3=YELLOW;
c3=3;
因为d3枚举变量对应的枚举符中没有YELLOW。
c3不能用一个整型数值直接赋值。
五、指针和引用
1.指针
指针是一种数据类型,具有指针类型的变量称为指针变量,是一种特殊的变量。
(1)定义:
指针是用来存放某个变量在内存中的地址值。
指针的类型是:
它所指向的变量的类型。
分类:
指向数组的指针
指向函数的指针
指向文件的指针
指向指针的指针
例:
inta=5;
int*p=&a;
说明:
p是一个指向int型变量的指针;
&a表示变量a的地址值,p的数值便是变量a的地址值;
(2)格式:
<类型>*<指针名>,*<指针名>…
例:
int*pi;//pi是一个指向int型变量的指针
float*pl;//pl是一个指向float型变量的指针
char*pc;//pc是一个指向char型变量的指针
char(*pa)[3];//pa是一个指向一维数组的指针
int(*pf)();//pf是一个指向函数的指针,该函数的返回值为int型数值
int**pp;//pi是一个指向指针的指针,即二级指针
(3)赋值:
任何一种类型的指针所赋的值都是内存地址值。
但是,不同类型的指针的内存地址值的表示不尽相同。
一般变量、数组元素、结构成员等其地址值都表示为变量名前加运算符&。
例如:
inta,b[10];变量a的地址值表示为&a;
数组元素b[3]的地址值表示为&b[3]等等。
数组的地址值用该数组名来表示。
例如:
inta[10],*p=a;p是一个指向数组a的指针,即指向a数组的首元素。
又例如:
intb[2][3],(*p)[3];
p=b;
b[0][0],b[0][1],b[0][2],
b[1][0],b[1][1],b[1][2],
p是一个指向数组b的指针,p所指向的是3个元素的一维数组,而b是一个二维数组,将b赋值给p,是让p指向二维数组的第O行,因为二维数组可以被看成为若干个行数组组成的,每个行数组对应是一个一维数组,这个一维数组是由若干个列元素组成。
上面所说的“第O行”是指这个二维数组的第O行所对应的一维数组,它是由3个int型元素组成的。
函数的地址值可用该函数的名字来表示,一个指向函数的指针可用它所指向的函数名字来赋值。
例如:
doublesin(doublex);
double(*pf)();
pf=sin;
pf是一个指向函数的指针,它所指向的函数是sin,这里用sin给pf赋值,实际上是让pf指针指向sin函数在内存中的入口地址。
上面列举了一些不同类型指针的赋值,有些指针的赋值在后面还会看到,例如,指向文件的指针等等。
定义了一个指针后,必须先给它赋值后才能引用,否则将有可能造成系统的故障。
(4)指针的运算
指针是一种特殊的变量,指针运算是很有限的。
一般来说,指针所允许的运算有如下4种:
1)赋值运算
一个指针所指向的变量的地址值
一个数组的地址值
一个函数在内存中的入口地址值
一个暂时不用的指针,为了安全起见,可以将O值赋给指针,使它变为空指针。
还可将一个已被赋值的指针赋给另外一个相同类型的指针。
例如:
inta,*p=&a,*q;
q=p;
使q指向与指针p所指向的变量相同,即p和q都是指向变量a的指针。
2)一个指针可以加上或减去一个整数值,包括加1或减1运算。
3)在一定条件下,两个指针可以相减。
4)在一定条件下,两个指针可以相比较。
2.指针和数组
在C++中,数组的元素可以用下标表示,也可用指针表示,但是最好还是用指针表示,因为指针表示要比下标表示处理起来更快。
因此,C++程序中,尽量使用指针来引用数组元素。
下面介绍数组元素的指针表示法。
(1)一维数组的指针表示法
例如:
inta[5];a是一维数组名,它有5个int型变量。
用下标方法表示如下:
a[i]其中:
i=0,1,2,3,4。
用指针方法表示如下:
*(a+i)其中a是数组名
C++中规定任何一个数组的名字是一个常量指针,该指针的值便是该数组的首元素的地址值。
在一维数组中,数组名就是首元素地址。
在上例中,a与&a[0]是一样的。
请注意:
常量指针与变量指针的区别。
在下例中:
inta[10],*p;
p=a;
下列表达式是合法的:
p+1,a+2,p=p+1,p-a
下列表达式是非法的:
a=a+1,a=a-1
(2)二维数组的指针表示法
例如:
intb[2][5];b是二维数组名,它有10个int型变量。
用下标方法表示如下:
b[i][j]其中:
i=0,1;j=0,1,2,3,4
用指针方法表示如下:
*(*(b+i)+j)其中:
i=0,1;j=0,1,2,3,4
这种表示方法可以这样理解:
b[0][0],b[0][1],b[0][2],b[0][3],b[0][4]
b[0][j]
b[1][0],b[1][1],b[1][2],b[1][3],b[1][4]
b[1][j]
一个二维数组可以看作是一个一维数组,它的元素又是一个一维数组。
对b[2][5]来讲,可以看成是具有2个元素的一维数组,即称行数组,每个元素(即每个行数组)又是具有5个元素的一维数组,称为列数组。
因此,b[2][5]可以看成为2个元素的一维行数组和5个元素的一维列数组组成。
前面讲过了一维数组的指针表示,将二维数组的行、列的一维数组都用指针表示,使得到如下形式:
*(*(b+i)+j)这是一个二级指针。
再将二维数组的行数组用下标表示,列数组用指针表示,得到如下形式:
*(b[i]+j)
再将二维数组的行数组用指针表示,列数组用下标表示,又得到如下形式:
(*(b+i))[j]
另外,按二维数组各个元素在内存中存放的顺序,用指向数组首元素的一级指针表示如下:
*(&b[0][0]+5*i+j)其中,&b[0][0]是b数组的首元素地址
(3)三维数组的指针表示略
例2.1分析下列程序的输出结果
#include
voidmain()
{
staticinta[5]={5,4,3,2,1};
inti,j;
i=a[0]+a[4];
j=*(a+2)+*(a+4);
cout<
}
输出结果:
64
说明:
该程序中,出现的关键字static是说明符,说明数组a是静态类整型数组。
经过初始化后,a数组的各个元素将获取数值。
i和j是两个int型变量,它们用来存放两个数组元素的和,这里使用了两种不同方式来引用数组元素:
一种是下标方式,另一种是指针方式。
最后,通过一个输出语句将变量i和j的值显示在屏幕上。
例2.2分析下列程序的输出结果
#include
voidmain()
{
staticchars1[]=“abcde”;
staticchars2[]={‘m’,’n’,’p’,’q’,’\0’};
char*ps=s1;
cout< cout<<‘\n’; cout< cout<<*ps<<*(ps+2)<<*(ps+4)<<*ps+2; } 输出结果: abcdeormnpq npde ace99 说明: 该程序中出现了两个字符数组s1和s2,并且初始化了。 又定义一个指针ps指向s1数组的首地址。 使用输出表达式输出一个字符串时,使用字符数组名或指向该字符串首地址的指针名。 使用输出表达式输出字符数组中某个元素时,可直接引用该数组元素,用下标或指针表示都可以。 程序中,输出表达式*ps+2的值为99,因为*ps是字符‘a’,它的ASCII码值为97,所以,该表达式值为99,实际上是字符‘c’的ASCII码值。 例2.3分析下列程序的输出结果 #include voidmain() { staticintb[][3]={{1,2,3},{4},{5,6}}; b[0][2]=7; b[1][2]=8; cout<<**b<<“\t”<<**(b+1)<<“\t”<<*(*(b+1)+2)<<“\n”; cout< } b[0][0]=1,b[0][1]=2,b[0][2]=3->7 b[1][0]=4,b[1][1]=0b[1][2]=0->8 b[2][0]=5,b[2][1]=6,b[2][2]=0 **b<=>*(*(b+0)+0)<=>b[0][0] **(b+1)<=>*(*(b+1)+0)<=>b[1][0] *(*(b+1)+2)<=>b[1][2] 输出结果: 148 15 说明: 程序中,b是一个被初始化的二维数组,又对它的两个元素赋了值,即改变了它初始化后的数值。 输出**b,**(b+l)和*(*(b+1)+2)的值分别为1,4,8这与b[0][0],b[1][0]和b[1][2]的值是相同的。 又由于b[0][2],b[1][2]和b[2][2]的值分别为7,8和0,因此,这三个元素的和为l5。 3.引用 引用也是一种特殊类型的变量,它不同于指针。 引用通常被认为是另一种变量的别名。 定义格式: <类型>&<引用名>(<变量名>); 或者: <类型>&<引用名>=<变量名>; 一般情况下,定义引用时必须初始化。 例如: inta=3; int&m=a; m是一个引用,它是变量a的别名。 所有在引用上所施加的操作,实质上就是在被引用者上的操作。 例如: m=m+5;实质上是a加5,使a值改变为8。 可以将一个引用赋给某个变量,则该变量将具有被引用的变量的值。 例如: intn=m;n具有被m引用的变量a的值,即8。 又例如: int*p=&m;这是将指针p指向a变量的地址。 指针与引用的区别: ·指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量; ·引用必须初始化,而一旦被初始化后不得再作为其他变量的别名。 一般情况下,初始化引用时需要用一个相同类型变量名。 但有时也可用一个常量对一个引用初始化,这时系统要建立一个临时变量。 例如: int&d=120; 将变为: intt=120; int&d=t;t是系统建立的临时变量。 也还可以用一个不同类型的变量来初始化引用,同样系统也会生成一个临时变量。 例如: floatf=5.6; int&d=f; 将变成: inttemp=int(f); int&e=temp; 引用的用途是用来作函数的参数或函数的返回值。 例2.5分析下列程序的运行结果 #include voidmain() { intval(5); int&refv=val; refv=refv+5; cout< int*p=&refv,val1(refv); cout<<*p<<“\t”< } 输出结果: 10 1010 说明: 从该例中可以看出: (1)引用在定义时要初始化。 (2)对引用的操作就是对被引用的变量的操作。 (3)可以用某个引用的地址值赋给一个指针,而指针则指向被引用的变量。 (4)可以用某个引用给一个变量赋值,该变量的值便是被引用的变量值。 以上是对引用这种特殊变量的初步理解。 六、运算符 C++中运算符比较多,有些不同功能的运算符使用了相同的符号,运算符还具有较多的优先级,还有结合性等,这些将给学习和使用运算符带来一些困难。 同学们一定要把这节学好,为以后编程打下基础。 学运算符时要掌握每种运算符的功能、优先级和结合性以及在使用中应注意的事项。 下面先按其功能分类进行讲解。 1.算术运算符 (1)普通算术运算符 ·单目算术运算符: -(取负),+(取正) 单目运算符的优先级高于双目运算符。 ·双目算术运算符: +(相加)、-(相减)、*(相乘)、/(相除) 适用于int,float和double变量 %(取余数): 只用于int型运算 优先级: *,/和%高于+,- 求两个数的余数的公式如下: 已知: <操作数1>%<操作数2> 其余数为: 余数=<操作数1>-<操作数2>*<整商> 其中,<整商>是<操作数1>除以<操作数2>所取的整数商。 例如: 5%8余数=5-8*0=5 16%8余数=16-8*2=0 37%8余数=37-8×4=5 (2)增1和减1运算符 单目运算符: ++(增1),一一(减1) 这两个运算符功能相近,下面着重讲解++。 ++运算符也是一个算术运算符,但与上面介绍的普通算术运算符有不同之处,因此,单独讲解。 1)++运算符的功能: ·由该运算符组成的表达式具有一定的值; ·由该运算符组成的表达式计算后,其变量值要发生改变。 这种功能并不是所有运算符都具有的。 例如: inta (1);a=1 ++a; 表达式++a的值为2,它是a+1的值; 变量a的值改变为2,它是a=a+1的值。 可见,++运算符会使表达式产生一个值,同时变量又改变了值。 通常称后者为一种副作用。 在C++中具有副作用的运算符除++和――外,还有赋值运算符。 2)++运算符作用于变量有两种方式: 前缀方式: ++运算符作用在变量的前边,上例属于前缀方式, 后缀方式: ++运算符作用在变量的后边。 例如: intb (2);b=2 b++; 表达式b++的值为2,b变量的值为3 3)结论: 参看下表来理解 ·++运算符的前缀运算表达式的值为原来变量值加1,后缀运算表达式的值为原变量值;不论前缀运算还是后缀运算变量的值都加1。 ·――运算符的前缀运算表达式的值为原来变量值减1,后缀运算表达式的值为原变量值;不论前缀运算还是后缀运算变量的值都减1。 表2-1++与――运算比较 前缀方式: 例inta (1); ++a;或――a; 后缀方式: intb (2); b++;或b――; 原变量值 运算后 变量值 前缀运算 表达式的值 原变量值 运算后 变量值 后缀运算表达式的值 ++ 不变 1 原变量值+1 2 原变量值+1 2 不变 2 原变量值+1 3 原变量值 2 ―― 不变 1 原变量值-1 0 原变量值-1 0 不变 2 原变量值-1 1 原变量值 2 2.关系运算符 关系运算符都是双目的,共有如下6种: >(大于), <(小于), >=(大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 第一节 数据类型 表达式