第二章基本数据类型基本数据类型整型 (i n t)
浮点型 (f l oat)
字符型 (c h ar )
双精度型 (d ou b l e )
布尔型 (b ool )
无值 (v oi d )
指针 (*)
引用 (&)
数组 ([ ])
联合 (u n i on )
枚举 (e n u m )
类 (c l as s )
引申数据类型结构化数据类型基本数据类型构造数据类型第二章 基本数据类型
§ 2.1 基本数据类型
§ 2.2 数据在计算机中的存储
§ 2.3 数据类型选择的原则
§ 2.4 表达式及运算符
§ 2.5 数据类型转换
§ 2.1 基本数据类型
整数型
字符型
字符串
实数型
布尔型
基本数据类型的修饰符基本数据类型 ---整型
整型常数
整型常量标识符
整型变量
整型的扩展整型 ----整型常数
十进制数
12,0,23,-127,… 有正负数之分
八进制数
012,045,063,059,078
十六进制数 无负数
0xef,0x12,0x445
0XC3,0Xed,0Xe2
注:
① 用不同的前导符来区别不同进制:八进制数前加 0,十六进制数前加 0x
② 十进制有负数,八、十六进制无负数整型 ----整型常量标识符
用一些符号(常量标识符)表示常数
用 const 关键字来定义一个常数如:
const int STUD_NUM=10;
const int PAGES=421;
const int SECONDS=0x12f;
const int MONTHS=023;
注:
常量标识符一般用大写整型 ----整型变量
int age;
int work_hours=8; //可以在定义时给出初始值
int total_hours=8+work_hours; //表达式可作初值
age=18*3-2; //在使用时可以赋值
work_hours++;
total_hours+=(50-age)/10;
注,一般用小写字母表示变量整型 ----整型的扩展 1
整型的扩展 ----long int (长整型 )
long int 能表示的数据范围一般比 int宽
long int 简称 long
long int 类型的常数表示为:
12L,23l,4432l,0xefl,0537L
long int 类型的变量和常量定义:
long l_var;
const long LC_VALUE=10;
整型 ----整型的扩展 2
整型的扩展 ----short int (短整型 )
short int 能表示的数据范围一般比 int窄
short int 简称 short
short int 类型的变量和常量定义:
short s_var;
const short SC_VALUE=20;
基本数据类型 ----字符型
字符常数
字符常量、变量标识符
特殊的字符字符型 ----字符常数
字符常数
‘ a‘~‘z‘;
A‘~‘Z‘;
0‘~‘9‘;
!‘,‘#‘,‘%‘,‘&‘,‘<‘,…..
注,字符必须用单引号括起来,否则会认为是标识符、
数字或其它符号字符型 ---字符常量、变量
字符常量标识符
const char BEST=?A‘;
const char NEWLINE=?\n‘;
字符变量标识符
char c;
char grade=?E‘;
grade=?E‘-4; //字符变量可以和整数一样运算
c=get_char( );
字符型 ---特殊的字符
特殊字符:
‘ \’ ----转义字符,‘ \’后的字符意义作了改变
转义字符有以下几种用法:
1,控制字符
2,有特殊含义的符号的表示
3,‘ \’与八、十六进制数值结合使用字符型 ---转义字符 1
控制字符
‘ \n‘ 换行符号 (newline) 0x0A
\f‘ 换页符号 (formfeed) 0x0C
\a‘ 响铃符号 (bell) 0x07
\b‘ 回格符号 (backspace) 0x08
\0‘ 空字符 (null) 0x00
例,cout << ―\aoperating\tsystem\n‖;
响铃的同时,显示,operating system,再输出时换行字符型 ---转义字符 2
有特殊含义的符号的表示
‘ \\’ 反斜杠 0x5c
\‘‘ 单引号 0x27
\―‘ 双引号 0x22
\?‘ 问号 0x3f
‘ 空格符 0x20
例,要输出提示信息:,Please enter ―Yes‖ or ―No‖,‖
可写成,cout << ―Please enter \―Yes\‖ or \―No\‖,‖
字符型 ---转义字符 3
‘ \’与八、十六进制数值结合使用,
用来表示相应数值的 ASCII码
\ddd 1~3位八进制数
‘ \000’ ~‘ \377’
\xhh 1~2位十六进制数 ‘ \x00?~?\xff?
说明,十六进制以 x开头,八进制不用例,char ch=?A?;
char ch=?\101?;
char ch=?\x41?;
转义字符小结
转义字符以反斜杠‘ \’开头,后跟相应字符
转义字符要用单引号括起来,代表一个字符例,char c1=?\n?; //换行符
char c2=?\007?; //响铃符
char c3=?B?;
char c4=66;
char c5=?\x42?; //以上三个语句等价字符型 ---补充说明
字符数据在内存中以 ASCII码存储,即以整数表示
C++中字符和整数之间可以互用,字符变量可以和整数一样运算例,int a=?b‘; //在内存中以整数表示
char c=97;
输出,cout << a <<endl;
cout << c <<endl; //输出不一样结果,98
a
字符串
C++字符串特点:
① 由双引号括起来的字符序列
② 以空字符‘ \0’ (null)结尾
③ 以数组形式表示及存储例:
,Hello‖
―a‖ 与 ‘ a‘
― ‖ 空串,只有 1个 null字符
字符串常量
const char MESSAGE[20]=―This is for you!‖;
const char BEST=―A‖; // const char BEST=?A‘;
注,左 BEST是字符串常量标识符,右 BEST是字符常量标识符基本数据类型 ----实数型
浮点型 float
表示数据的范围是 –3.4E+38~3.4E+38
有效数字是 7位
双精度型 double
表示数据的范围是 –1.7E+308~1.7E+308
有效数字是 15位
长双精度型 long double
表示数据的范围是 –3.4E+4932~1.1E+4932
有效数字是 19位实数型 ----常数表示法
定点数表示法 ( 小数表示法)
浮点数,-0.2113f,12.34f
双精度数,0.00213,.224
长双精度数,-0.00213L,1.234L
指数表示法
1.23e10=1.23X1010
8.84E123=8.84X10123
注:默认是双精度型实数型 ---常量、变量
浮点常量
const float PI=3.141593;
const double L_PI=3.14159265;
浮点变量
float wages=3.34e23;
double d_wages;
long double ld_wages;
d_wages=5600*1.1;
ld_wages=d_wages/2.1;
基本数据类型 ---布尔型
布尔型 (bool)数只有两个值,true和 false
这两个值满足:
!false==true 非假即真
!true==false 非真即假例:
bool end;
end=true; //end具有值 true
基本数据类型 ---布尔型
条件表达式将返回布尔型值
bool end=false;
end=true;
end=(a<b)&&(b<c);
end=(abs(delta)<EPS);
end=!end;
基本数据类型的修饰符
long,short,signed,unsigned
long 修饰 int 和 double
short 修饰 int
signed 修饰 int 和 char
unsigned 修饰 int 和 char
注,int和 char默认为 signed
§ 2.2 数据在计算机中的存储
计算机内存单元的单位是字节
不同的计算机中,同一数据类型占用的空间不一定相同
数据占用内存字节的多少,决定了其能表示的数据的范围
计算机对内存中存放的同样信息的解释会因其所表示的数据类型的不同而不同以字节( Byte) 为单位不同数据类型占用不同数目的字节短整数
—1 4 5
浮点数
4 5 6,3 2 1
字符串
,H e llo,
内 存 单 元短整数占两个字节 (16bit)
符号位 整数值 整数值
0000 0001 1100 1000 0000 0001 1100 1000
unsigned int
短整数 (short),456=0x01c8
signed int
浮点数占 4个字节( 32bit)
浮点数,456.321=0.456321*103
尾数,0.456321 用 24bit存放指数,3 用 7bit存放正负数,+ 用 1bit存放指数 ( 7位 ) 尾数 ( 24位 )
符号位双精度数占 8个字节( 64bit)
…,
尾数 ( 53位 )指数 ( 10位 )
符号位双精度数,456.321= 0.456321*103
尾数,0.456321 用 53位存放指数,3 用 10位存放正负数,+ 用 1位存放字符占 1个字节( 8bit)
字符,A
以 ASCII编码的值存放
A‘的 ASCII编码为 65( 0x41)
0 1 0 0 0 0 0 1
4 1
字符串所占字节数等于字符数加 1
字符串:,HELLO”
每个字符占一个字节,共六个字节字符串以空字符 ‘ \n‘结尾,ASCII码为 0
0 1 0 0 1 0 0 0
0 1 0 0 0 1 0 1
0 1 0 0 1 1 0 0
0 1 0 0 1 1 0 0
0 1 0 0 1 1 1 1
0 0 0 0 0 0 0 0
H E L L O \n
‘ H?=0X48
‘ E?=0X45
‘ L?=0X4C
‘ L?=0X4C
‘ O?=0X4F
0X00
布尔型数占 1个字节( 8bit)
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
true
false
简单数据类型的取值范围数据类型 位数 数值范围
char 8 -128~127
short 16 -215~(215-1)
int 32 -231~(231-1)
long 32 -231~(231-1)
unsigned char 8 0~255
unsigned short 16 0~65535
unsigned int 32 0~(232-1)
unsigned long 32 0~(232-1)
浮点数的取值范围数据类型 位数 数值范围 精度
float 32 -3.4E38~3.4E38 7 位
double 64 -1.7E308~1.7E308 15位
long double 80 -3.4E4922~1.1E4922 19位
§ 2.3 数据类型选择的原则 1
根据所表示的数据的类型选择例如:
年龄、数目 ————整数长宽高、面积 ———浮点数名字、地址 ————字符数组真或假、是或非 ——布尔数学生、书 —————结构或类数据类型选择的原则 2
根据所表示的数据的范围选择例如:
年龄,short
成绩,unsigned short
阶乘,long或 float或 double
只有两个值,bool
只有几个值,enum
§ 2.4 表达式及运算符
什么是表达式
表达式的构成
介绍几种表达式及运算符表达式
下面都是表达式
1+2+3 //算术表达式
perimeter=2*PI*radius //赋值表达式
cin>>num //输入表达式
cout<<―Hello,world!‖<<endl //输出表达式
(a<=b)&&(c>=d) //逻辑表达式表达式的定义
表达式是由 操作数 和 操作符(运算符)
按照一定 语法规则 构成的符号序列表达式的构成
表达式与语句
表达式中的操作数
表达式中的运算符
表达式的语法规则
表达式的值表达式与语句
表达式加上分号构成表达式语句
1+2+3;
perimeter=2*PI*radius;
cin>>num;
cout<<―Hello,world!‖<<endl;
(a<=b)&&(c>=d);
表达式中的操作数
操作数
基本数据类型
--整型数
--实型数
--字符
构造数据类型
--字符串、数组、指针、引用、结构、对象
子表达式表达式中的操作数
1+2+3; //整型常量
perimeter=2*PI*radius; //浮点型变量
cin>>num; //类的对象
cout<<―Hello,world!‖<<endl; //字符串
(a<=b)&&(c>=d); //子表达式表达式中的运算符
算术运算符,+,-,*,/,%
赋值运算符,=
逻辑运算符,&&,||、!
关系运算符,==,!=,<,<=,>,>=,< >
输入运算符,>>
输出运算符,<<
其它,?:、,,+=、(),[],*,&、等表达式中的运算符
1+2+3; //算术运算符
perimeter=2*PI*radius; //赋值运算符
cin>>num; //输入运算符
cout<<―Hello,world!‖<<endl; //输出运算符
(a<=b)&&(c>=d); //比较、逻辑运算符表达式中的运算符
单目、双目、三目运算符
单目,-a !a a++ --a
双目,a+b a<=b a&&b
三目,a? b,c
表达式的语法规则
每种运算符操作的数据类型和运算结果有规定,如:
a%b 操作数只能是整型
&&,||、! 操作数是布尔型
a < b 运算结果是布尔型
a++ 运算结果与 a的类型相同表达式的语法规则
每种运算符的 操作方式 有其特定的规则语法 a + b 不能写成 +ab,ab+
结合性 a + b – c 先执行 a + b
优先级 1+3*2 结果为 7,不是 8
运算符的结合性
表达式中出现相同级别的运算符时,先执行左边的运算符,则称该运算符为 左结合,否则为 右结合
a+b-c 左结合 (a+b)-c
a=b=c 右结合 a=(b=c)
注,绝大多数运算符是左结合运算符的优先级规则
先乘除、后加减
4+5*6=34
先计算、后赋值
c=a<=b
先比较、后逻辑
a>b&&b>c
括号改变优先级
area=(a+b)*h/2
表达式的值
大多数表达式具有值
表达式的值可能是任意数据类型
10+20*2 的值是整数 50
radius=3.14*2/4 的值是小数 1.57
A‘ 的值是字符?A‘
cin>>grade 的值是输入流对象 cin
cout<<grade 的值是输出流对象 cout
表达式的值
由于表达式具有值,所以 表达式可以嵌套
a=b=5 等价于 a=(b=5)
b+(c=5) 等价于 c=5,b+5
cin>>a>>b 等价于 cin>>a; cin>>b;
介绍几种表达式及运算符
1,赋值表达式
2,赋值运算符
3,逗号表达式
4,sizeof 运算
5,表达式与运算符的补充说明
6,表达式与运算符小结赋值表达式表达式 1=表达式 2;
赋值构成一个表达式
赋值表达式的值是赋值运算符左边表达式的值
perimeter=2*PI*radius;
a=b=c*2;
赋值表达式 ---左值
左值是能出现在赋值运算符左边的表达式
左值具有两个条件:
1、具有存放数据的 空间
3=3; //不允许,常量没有存储空间
2、该空间是 允许修改 的
const int ci=10;
ci=10; //不允许,常量的空间不能修改赋值表达式 ---左值
变量是左值
i=8
赋值表达式是左值
j=m+n
返回引用的函数是左值
(x=max(5,7))+=3
//等价于,(x=max(5,7))= (x=max(5,7))+3
赋值表达式 ---右值表达式 1=表达式 2;
右值是能出现在赋值运算符右边的表达式右值表达式要求具有值左值表达式可以作为右值表达式赋值表达式 ---右值
int a,b;
void func( ); //函数不返回值
a=(b=10); //b=10是左值表达式
a=b; //b可以作为右值
a=func( ); //错误! 函数不返回值赋值运算符
变量和常量初始化不是赋值
const int CI=10; //初始化
int ivalue=10; //初始化
ivalue=20; //赋值赋值运算符 ---赋值缩写
a+=b 等价于 a=a+b
a-=b 等价于 a=a-b
a*=b 等价于 a=a*b
a/=b 等价于 a=a/b
a%=b 等价于 a=a%b
赋值表达式 ---赋值兼容
赋值运算符两边的表达式要求类型兼容
int i=0x1032;
char c;
c=i; //将整数赋给字符型时会丢失一些信息
cout<<c; //输出字符‘ 2’
cout<<(int)c; //输出十进制数 50
逗号表达式表达式 1,表达式 2,…..,表达式 n
逗号表达式具有值
其值是表达式 n的值
(即最右边表达式的值是逗号表达式的值)
逗号表达式
int a,b,c,d;
d=(a=1,b=a+2,c=b+3);
cout<<d<<endl; //输出结果为,6
逗号表达式可以用于函数调用中的参数例如,func(n,(j=1,j+4),k);
Sizeof 运算
sizeof (类型名 ) 或 sizeof (表达式 )
计算并返回操作数所占的内存空间 单位:字节
sizeof (int); //值为 4
sizeof (char); //值为 1
sizeof (3.14*2); //值为 8
sizeof (3.14L*2); //值为 10
表达式与运算符的补充说明
,=” 与,==” 前者“赋值”,后者“等于”
,&&” 和,||” 也称短路运算符
—&&— 左边为 0,右边不用再计算,结果为 0
— || — 左边为 1,右边不用再计算,结果为 1
a++ 与 ++a 单独使用时,结果相同例,int x=3;
cout<<x++; //结果为 3
cout<<++x; //结果为 4
表达式与运算符的补充说明
避免副作用
,++”,,--”,,=,具有副作用例如:
int a=3,b=5,c;
c=a*b+++b;
cout<<c<<endl; //编译器不同,结果不同办法,将复杂表达式分解成多个简单表达式表达式小结
表达式具有值
表达式具有类型为计算表达式的值,需要知道每个运算符的含义,运算符之间的结合性和优先级为确定表达式的结果类型,需要知道操作数的类型及类型之间的转换关系表达式小结
一元运算符的表达式结果类型与操作数的类型相同
算术运算符的表达式结果类型与进行类型转换后的操作数相同,类型转换会使两个操作数的类型相同
//?关系、逻辑运算符的表达式结果类型是 int型,其值为 0或 1
表达式小结
赋值表达式的结果类型是左值的类型
条件表达式( E1>E2?E3:E4)的结果类型是 E3或 E4的类型
sizeof (表达式 )的结果类型是 int型,单位是字节
逗号表达式的结果类型是最后一个表达式的类型除常量表达式外,表达式的求值都在程序运行时进行,而其结果类型是在编译时静态决定
§ 2.5 数据类型转换
类型转换的概念
赋值运算的类型转换
隐式类型转换
显式类型转换
类型转换的不安全性数据类型转换
C++遇到两个类型不同的数进行运算时,须先将它们转换成相同的数据类型,然后再进行运算
3+1.0 转换为,double+double
‘ A‘+3 转换为,int+int
转换原则,由占用字节少的向占用字节多的类型转换转换目的,在转换过程中不丢失信息数据类型转换
c h ar
s h or t
in t
lon g in t
u n s ign e d c h ar
u n s ign e d s h or t
u n s ign e d in t
u n s ign e d lon gf loat
d ou b le
lon g d ou b le
赋值运算的类型转换转换原则:
,=” 左右两边操作数的类型不一致时,
右转换成左的类型,再将转换结果赋给左,即赋值表达式的结果类型是左数的类型。
例,int i;
i=3.8; //这种转换会丢失部分信息隐式类型转换
转换总是朝着表达式数据能力更强的方向进行(赋值除外)
转换是在运行过程中 自动进行 的
float f=3.5;
int n=6;
long k=21; float double
double ss; int double
long double
ss=f * n+k/2;
整除显式类型转换显式类型转换(强制转换)
两种方法:
数据类型(表达式)
或 (数据类型)表达式例:
int(3.14159) 等于 3
(float)3 等于 3.0
显式类型转换
好处一:减少隐式转换的次数例,int val=val+3.14159;
隐式转换:两次显式转换:一次即可
int val=val+(int)3.14159;
显式类型转换
好处二:使结果正确例,float f=34/5+1;
隐式转换:结果为 7
显式转换:
float f=float(34)/5+1; //结果为 7.8
显式类型转换
好处三:解决二义性如果定义了两个重载的函数:
print(double);
print(float);
则调用 print(5)将产生二义而调用 print(float(5))将能正确调用类型转换的不安全性
类型转换可能是不安全性的
long lval;
unsigned char uc;
int(3.14159); //丢失小数部分
(signedchar)uc; //正数可能变成负数
short(lval); //丢失前两个字节信息