inti;cin>>i;
}
C++数据类型转化
1.自动类型转化
(1).两个不同类型的操作数进行运算时,先将较小范围的数转化为另一个较大范围的数,然后再进行计算。
各种基本数据类型的范围从小到大的排列次序如下:
char,bool→short→int→float→double
unsignedchar→unsignedshort→unsignedint→float→double
(2).对于bool,char,short,int,类型,任意两个值之间进行算术运算,位运算,其结果都是一个int值。
任意两个值之间进行逻辑运算,其结果都是一个bool值。
(3).对于bool,char,short,int类型,任一个类型值(无论是否带符号)与unsignedint之间进行算数运算,其结果都是unsignedint类型。
四个强制类型转换操作符
static_castdynamic_castconst_castreinterpet_cast
如:
static_cast<数据类型>(数值表达式)
doubled=1234.5678;
inti=10*static_cast(d)
C++的控制语句
选择结构
IF语句
if(表达式)语句1;
else语句2;
*******************
if(表达式1)
if(表达式2)语句1
else语句2
else
if(表达式3)语句3
else语句4
if(i!
=j)
if(i>j)
cout<<”i>j”<else
cout<<”ielse
cout<<”i=j”<**********************
if(表达式1)语句1;
elseif(表达式2)语句2;
elseif(表达式3)语句3;
……
else语句n
或者写成这样的嵌套形式
if(表达式1)语句1;
else
if(表达式2)语句2;
else
if(表达式3)语句3;
……
else语句n
********************
switch结构
switch(变量名或表达式)
{
case常量表达式1:
语句1;break;
case常量表达式2:
语句2;break;
……
case常量表达式n:
语句n;break;
default:
语句n+1;
}
循环结构
while循环
while(表达式)
循环语句;
******************
do-while循环
do
循环体语句;
while(表达式);
********************
for循环
for(表达式1;表达式2;表达式3)
循环语句;
(1)计算表达式1的值
(2)计算并判断表达式2的值,若表达式2的值非0或为True,则接着执行第(3)步;否则跳转到第4步。
(3)执行循环语句,计算表达式3的值,返回第2步。
(4)跳出循环,接着执行后面的语句。
*************************
foreach循环
inttemp,a[10]={1,8,9,0,7,9,6,7,8,9};
foreach(intnina)
{
cout<temp=n+1;
cout<<"temp="<}
break语句
它用在switch语句和循环语句中,功能是:
立即从它包含的switch语句体或包含它的最内层的循环体中退出,开始按顺序执行后面的语句。
continue语句
continue语句用在循环语句中,功能是:
立即结束本次循环的执行,转到判断循环条件的语句用来判断是否进行下一次循环。
goto语句
无条件转移语句
例子1
voidmain()
{
intx=3;
do
{
cout<<(x-=2)<<"";
cout<<"x="<}
while(!
(--x));
intj;cin>>j;
}
运行结果:
1x=1
-2x=-2
这是因为while(!
(--x))当x=0时!
x就是1,而当x为非零值时!
x为0。
例子2
voidmain()
{
intx=1,i=1;
intm;
for(;x<50;i++)
{
cout<<"x="<if(x>=10)break;
if(x%2!
=0){x+=3;continue;}
x-=-1;
}
cout<cin>>m;
}
显示结果:
C++数组
数组的定义与初始化
数组可以由除void型以外的任何类型构成,定义数组的格式为:
C++里面的数组虽然说是下标从0开始,但是就像:
intyy[10]={……}
它仍然是定义了一个有10个元素的整型数组,不是11个元素,但是我们还要使用从0—9来访问这个数组里面的十个元素……
数据类型标识符[常量表达式1][常量表达式2]……;
定义数组
定义数组时可以对全部的元素进行初始化:
inta[3]={1,2,3};
intb[2][2]={23,12,0,4};或者intb[2][2]={{23,12},{2,4}};
也可以仅对一部分元素初始化:
floata[5]={1,2,3,4}
floatb[3][3]={{23,12,0},{2,6},{9}};
如果对全部元素初始化,数组元素个数不必给出:
inttt[]={1,2,3,4,5};
定义二维或多维数组时,如果同时对全部元素初始化,第一维的下标可以不给出。
intnn[][2][2]={1,2,3,4,5,6,7,8,9,0,11,12};
字符数组和字符串
charstr[20]
charstr[]={‘W’,’e’,’l’,’c’,’o’,’m’,’e’,’’,’t’,’o’,’’,’C’,’+’,’+’}
上面的语句只是定义并初始化了一个包含14个字符的普通字符数组,而不能构成C++字符串。
若想使字符数组构成一个字符串,则必须在初始化字符数组或给字符数组赋值时,使其中的某个字符元素的值为空字符’\0’。
例如:
charstr[]={‘W’,’e’,’l’,’c’,’o’,’m’,’e’,’’,’t’,’o’,’’,’C’,’+’,’+’,’\0’}
#include"stdafx.h"
usingnamespacestd;
voidmain()
{
//字符串与普通的字符数组
inti;
charstr[]={'W','e','l','c','o','m','e','','t','o','','C','+','+'};
foreach(charminstr)cout<cout<//但是这样语句是错的:
//cout<//它会显示乱码,发生其他的错误,虽然编译器不会报错。
charmm[20];
cin>>mm;
cout<foreach(charvinmm)cout<cout<cin>>i;
}
用户输入的字符在储存到字符数组中时,会自动的加上’\0’但是输入的字符不可以超过所定义的数组长度。
指针和引用
定义和使用指针
数据类型*标识符
int*ptr1
float*ptr2
使用指针之前必须给它赋值,使它确实指向某个对象。
使用符号&给指针赋值,这里&是取值运算符。
inti,*ptr1;
ptr1=&i;
可以将一个指针赋值给另一个指针,使两个指针指向同一个变量。
为指针赋值之后,就可以使用指针和解引用指针操作符*来操作它所指向的对象。
语法格式为:
*指针名
这时表达式“*指针名”和指针所指向的对象或变量名,是等价的。
(1)一种类型的指针不能指向另一种类型的变量
(2)可以把数值0赋给任何类型的指针变量,表示该指针为空指针,即不指向任何对象。
(3)不能将一个整型变量或非零整数常量直接赋值给指针变量。
(4)C++提供一种VOID类型的指针,可以保存任何类型变量(对象)的地址。
可以使用VOID型指针和其他指针进行比较,但不允许使用VOID型指针操作它所指向的对象。
当把VOID型指针赋值给其他类型指针时,需要使用强制类型转换。
指针和数组
指针的算术运算和关系运算
指针可以和整数进行加减法运算。
比如prt是一个指针,n是一个整数。
那么:
Ptr+n,ptr-n仍然是一个相同类型的指针。
指针ptr+n指向连续储存在ptr所指向的对象(变量)后面的第n个相同的对象。
inti,*ptr;
ptr=&i;
如果ptr存放的地址是1000,ptr+5仍然是一个整型指针,指向的地址是1020,因为一个int类型的数据在内存中占4个字节,而指针ptr+5指向连续存放在变量i后面的第5个整数。
数组元素在储存器中是连续存放的,利用指针加减法的性质,利用指针可以方便的访问数组。
指针也可以进行简单的关系运算。
通过比较指针是否为0,可以判断指针的值是否为空。
两个相同类型的指针进行比较时(这种比较运算常用于使用指针操作数组元素)。
如果ptr1==ptr2说明这两个指针指向同一个数组元素;如果ptr1数组指针与指针数组
1.数组指针
数组指针是指向数组的指针。
定义数组指针的格式:
数据类型(*标识符)[常量表达式1][常量表达式2]…;
对于一维数组,数组的名称代表了数组的首地址。
ptr=a;
C++认为一个多维数组也是一个一维数组……
#include
usingnamespacestd;
voidmain()
{
inta[3][3],i,j,s=0;
int(*ptr[3]);
ptr=a;
cout<<”请输入矩阵的值:
”;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
cin>>*(*(ptr+i)+j);
if(i==j)
s+=*(*(ptr+i)+j);
}
cout<<”输出矩阵:
\n”;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<cout<}
cout<<”矩阵主对角线元素的和为:
”<
}
使用操作符new和delete进行动态储存分配
C++提供了动态分配内存空间的方法,即在程序运行过程中,根据实际需要为变量(对象)或数组分配内存空间。
每个程序运行时,操作系统都会为其分配一块可用的内存空间,用来存放动态创建的对象,这块储存空间称为程序的自由储存区或堆。
C++使用操作符new和delete来完成动态内存分配。
语法格式为:
(1)创建动态变量
指针名=new数据类型;
(2)创建动态数组
指针名=new数据类型[表达式1][表达式2]…;
如:
int*ptr1=newint;
float*ptr2=newfloat[10]
float*ptr3=newfloat(123.993)
但是不可以对数组进行这样的初始化。
由new操作符为对象动态分配的储存空间,程序结束前,要使用delete操作符动态释放。
(3)释放动态创建的变量
delete指针名;
(4)释放动态创建的数组
delete[]指针名;
引用的定义与使用
一个引用的变量是一个已经存在的相同类型变量的别名。
定义引用变量的语法格式为:
数据类型&标识符=变量名;
定义引用变量的同时必须对其初始化,引用一经定义,就已经是某个变量的别名,不能用它再去引用其他的变量。
inti,j=10;
int&k=i;
k=j;
语句执行之后i,j,k的值都是10,i和k是同一个变量,它们的内存地址是相同的。
枚举和结构
(1)枚举
枚举是一种由编程者自定义的数据类型。
如果一个变量只有几种可能的取值,则可以定义为枚举类型。
声明枚举类型的语法格式为:
enum枚举类型名{变量值列表};
如:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
声明了枚举类型后,就可以定义枚举类型的变量了:
enum枚举类型名标识符;
或
枚举类型名标识符;
enumweekdayaday;
或者不声明枚举类型名:
enum{sun,mon,tue,wed,thu,fri,sat}aday;
变量aday的值只能是sun到sat之一。
声明枚举类型时,变量值列表中的标识符是一些符号常量,每一个都对应一个确定的整数值。
第一个符号常量的值为0,第二个符号常量的值为1,第三个符号常量的值为2……
即sun=0,mon=1,…,sat=6。
也可以
enum{sun,mon,tue=5,wed,thu,fri,sat};
那么sun=0,mon=1,tue=5,wed=6,…sat=9。
不能把一个整数值直接赋给一个枚举类型的变量。
aday=2;
是错误的
但是可以进行强制类型转换
aday=(weekday)2;
(2)结构
这也是编程者自定义的复合数据类型。
在结构体中可以把不同类型的变量组合在一起,构成一个整体来表示某种事物的个体。
struct结构名
{
数据类型1标识符1;
数据类型2标识符2;
……
数据类型n标识符n;
}
例如:
structemployee
{
intnum;//员工编号
charname[20];//姓名
charsex;
intage;
floataccumPay;//月薪总额
}
employeeanempol;
anemplo.num=10110;
anemplo.name=”Peter”
anemplo.sex=’m’
……
也可以
employeeanemplo={10100,“Peter”,’m’,35,’人事部’,……}
还可以定义数组结构,其中的每个元素都是一个结构变量:
employeeanemploaeear[3];
C++的函数
定义和调用函数
定义函数:
类型说明符函数名(形式参数列表)
{
语句序列;
}
(1)有的函数有返回值,返回值可以是出数组以外的任何类型:
整数、浮点型、字符型、布尔型、指针型、结构、类的对象。
此