inti;cin>>i;
}
(9)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)
2.C++的控制语句
(1)选择结构
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;
}
(2)循环结构
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="<}
(3)break语句
它用在switch语句和循环语句中,功能是:
立即从它包含的switch语句体或包含它的最内层的循环体中退出,开始按顺序执行后面的语句。
(4)continue语句
continue语句用在循环语句中,功能是:
立即结束本次循环的执行,转到判断循环条件的语句用来判断是否进行下一次循环。
(5)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;
}
显示结果:
3.C++数组
(1)数组的定义与初始化
数组可以由除void型以外的任何类型构成,定义数组的格式为:
C++里面的数组虽然说是下标从0开始,但是就像:
intyy[10]={……}
它仍然是定义了一个有10个元素的整型数组,不是11个元素,但是我们还要使用从0—9来访问这个数组里面的十个元素……
数据类型标识符[常量表达式1][常量表达式2]……;
1)定义数组
定义数组时可以对全部的元素进行初始化:
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};
2)字符数组和字符串
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’但是输入的字符不可以超过所定义的数组长度。
(2)指针
1)定义和使用指针
数据类型*标识符
int*ptr1
float*ptr2
使用指针之前必须给它赋值,使它确实指向某个对象。
使用符号&给指针赋值,这里&是取值运算符。
inti,*ptr1;
ptr1=&i;
可以将一个指针赋值给另一个指针,使两个指针指向同一个变量。
为指针赋值之后,就可以使用指针和解引用指针操作符*来操作它所指向的对象。
语法格式为:
*指针名
这时表达式“*指针名”和指针所指向的对象或变量名,是等价的。
(1)一种类型的指针不能指向另一种类型的变量
(2)可以把数值0赋给任何类型的指针变量,表示该指针为空指针,即不指向任何对象。
(3)不能将一个整型变量或非零整数常量直接赋值给指针变量。
(4)C++提供一种VOID类型的指针,可以保存任何类型变量(对象)的地址。
可以使用VOID型指针和其他指针进行比较,但不允许使用VOID型指针操作它所指向的对象。
当把VOID型指针赋值给其他类型指针时,需要使用强制类型转换。
指针的运算
1.赋值运算
inta=16,b=28;
floatx=32.6f,y=69.1f;
int*pa,*pb=&b;
float*px,*py=NULL;
px=&x;
pa=pb;//pa和pb都指向了同一个变量。
2.间接引用运算
inta=16,b=28;
int*pa,*pb=&b;
cout<<*pb<pa=&a;
cout<*pa=32;
cout<“&”求址运算与“*”间接引用运算是一对互逆的运算。
对于任意一个变量v,*&v==v。
对于任意一个指针变量p,&*p==p。
3.与整数的运算
使指针移动,与整数的加减运算和自增自减运算。
如:
inta[]={11,22,33,44,55,66,77,88};
cout<<"a="<int*p=a;
for(inti=0;i<=7;i++){
cout<<"a["<
p++;
}
int*pa=&a[4];
cout<<"pa-2"<cout<<"pa+3"<