第2章数据类型与表达式

Download Report

Transcript 第2章数据类型与表达式

第2章 数据类型与表达式
2.1
2.2
2.3
2.4
2.5
2.6
2.7
C++的数据类型
常量
变量
C++的运算符
算术运算符与算术表达式
赋值运算符与赋值表达式
逗号运算符与逗号表达式
2.1 C++的数据类型
数据——程序处理的对象
数据类型——根据数据的表达形式的
不同而划分的类别。
各种数据在内存中均以0、1的二进制
形式存储,但存储格式不同。
 整型数据分为:短整型(short int 或short)
一般整型(int)
长整型(long int或long)
整型(short int、int、long int)和字符型char的前
面,可加修饰符signed(表示“有符号”)或
unsigned(表示“无符号”),默认为signed 。
sizeof(数据类型):可确定数据类型的字节长
度。
例:cout<<sizeof(int)<<endl;
 浮点型(又称实型)数据分为:
单精度(float)
双精度(double)
长双精度(long double)
一般用double定义存放小数的变量。
布尔型(bool):C语言无此类型,它用0代表
“假”,非0(如1)代表“真”。C++中添加了
该类型,其值为True和False。但不是所有编译器
都支持。
空类型(void):无值,不能用来定义变量。
2.2 常量
2.2.1 什么是常量
常量的值是不能改变的,程序中一般包
含直接常量(一般常量)和符号常量两种。
根据数据类型的不同,整型常量
常量可分为:
实型常量(浮点型常量)
字符常量
字符串常量
1、整型常量(整数)
分十进制整数、八进制整数和十六进制整
数。
书写格式:
整型常量类型
表达形式
有无正负
十进制
八进制
十六进制
10、10L或10l
012
0xA
有正负
只有正
只有正
注意:10L、10l 表示长整型,10为一般整型。
2. 浮点型常量(实型常量)
有两种不同的方式表示:
浮点型常量表示方法
表达形式
十进制小数形式
0.12 、-1.0 、5. 、 .6
指数形式
12e3、1.2e4、0.12E5
在程序中不论把浮点数写成小数形式还是指数形
式,在内存中都是以规范化的指数形式存放。
注:
(1) 指数形式的书写
数符 数字部分 指数部分
E和e的前面必须要有数字,且E后面的
指数必须为整数。
例:e3 、2.1e3.5 、.e3 、e ×
(2)浮点型常数缺省为double型,如表示float型,
则在实数后加f或F。
如:34.56f
34.5
3 字符常量
(1)、普通的字符常量
用单撇号括起来的一个字符,如′a′,′#′。在内存
中占一个字节。
注意:
①只能包括一个字符,如′AB′ 是不合法的。
②字符常量区分大小写字母,如′A′和′a′是两个
不同的字符常量。
③撇号(′)是定界符,而不属于字符常量的一部分。
(2)、转义字符常量
非图形字符(如回车、制表符)及\、 ' 、“等
字符。
用以 “\”开头的转义字符常量表示这些特
殊字符,见P24表2.2。
'\n' 代表一个“换行”符。
“cout<< '\n' ; ” 与“cout<<endl; ” 作用相同。
\ddd:1至3位8进制数。‘\101’表示‘A’,’\007’表示‘\a’
响铃
\xhh:1至2位16进制数。‘\x41’表示‘A’,
’\x07’表示‘\a’
‘\0’为空白符,即NULL,码值为0。
响铃
(与‘0’的区别,‘0’的码值为
48)
(3)、 字符数据在内存中的存储形式
及其使用方法
存储该字符相应的ASCII码,并以二进
制形式存放。
例如:
c1=‘a’
c2=‘b’
注意:字符数据的运算,均以字符的ASCII码
进行运算。
字符数据的使用方法:
1、字符数据和整型数据可以相互赋值。
2、字符数据和整型数据之间可以运算。
例2.1字符数据和整型数据相互赋值。
#include <iostream>
using namespace std;
int main( )
{
int i;
char j;
//j是字符型变量
i='A';
//将一个字符常量赋给整型变量i
j=97;
//将一个字符常量赋给整型变量j
cout<<i<< '\n'<<j<<'\n';
return 0;
}
例2.2 字符数据与整数进行算术运算。下面程
序的作用是将小写字母转换为大写字母。
#include <iostream>
using namespace std;
思考:
int main( )
如何将一个数字字
{char c1,c2;
符转换成数值:‘1’
c1=′a′;
转换为1?
c2=′b′;
‘0’c1=c1-32;
‘0’=0
c2=c2- ’a’ +’A’;
cout<<c1<<′ ′<<c2<<endl;
‘1’return 0;
‘0’=1
}
‘4’‘0’=4
4. 字符串常量
用双撇号括起来的部分就是字符串常量。如
″abc″。
注意:‘0’ 和 “0” 的区别。‘0’为字符
常量,“0”为字符串常量。
C++规定以字符‘\0’作为字符串结束标志。
在内存中以‘\0’为结尾。
字符串常量″abc″在内存中占4个字节(而不是3
个字节),见图。
‘\0’在输出时不显示,只表示字符串结束。
cout<< ″abc″<< ″s″ <<endl;
输出4个字符abcs,而不包括'\0' 。
注意: ″a″和′a′不同,″a″是字符串常量,′a′
是字符常量。前者占两个字节,后者占1个字节。
char c;
//定义一个字符变量
c=′a′;


c=″a″;
思考: 字符串常量″abc\n″包含几个字符?
编译系统遇到“\”时就会把它认作转义字符
的标志,把它和其后的字符一起作为一个转义
字符。
2.2.4 符号常量
在C++程序设计中,常
用一个符号名代表一个
常量,称为符号常量。例:已知圆半径r , 计
预编译命令:
#define 符号常量名
值
算圆的周长及面积。
2.3 变量
2.3.1 什么是变量
在程序运行期间值可以改变的量称为变量。
变量名
变量
变量值
变量类型
2.3.2 变量名命名规则
C++规定标识符只能由字母、数字和下划线3
种字符组成,且第一个字符必须为字母或下划线。
如: sum, total2, _day, Student_name
不能与C++关键字相同(如:不能取名为main、
Class、if、friend等)
下面标识符是否合法:

  
_student, s_max,
Float,
float






M.D.John , #33, 3G64 , Ling li , C++,return
注意:大写字母和小写字母被认为是两个不同
的字符。
如:sum和SUM是两个不同的变量名。
命名约定:
1、变量名、函数名用小写字母;
2、符号常量名及宏用大写字母;
3、下划线开头的名字常为系统程序(库函数
用),用户一般不用。
4、要有意义:如sum表示“求和变量”。
国外软件命名时,第1个字母表示数据类型,
如isum
2.3.3 定义变量
变量必须“先定义,后使用” 。
如:float a , b , c;
定义a,b,c为单精度型变量,注意各变量间以逗
号分隔,最后是分号。
C语言要求变量的定义应该放在所有的执行语
句之前,而C++则只要求在第一次使用该变量之
前进行定义即可。
int a;
//定义a为一般整型变量
long b;
//定义b为长整型变量
short c;
//定义c变量
unsigned short d; //定义d为无符号短整型变量
float e;
//定义e为单精度浮点型变量
double f;
//定义f为双精度浮点型变量
long double g;
//定义g为长双精度浮点型变量
char h;
//定义h为字符型变量

注意:string i
标准数据类型中无字符串类型的变量
2.3.4 变量赋初值
变量定义时赋初值。初值可以是常量,
也可以是一个表达式。如
float a , b = 5.78, c= 2*sin(2.0);
注意:数学函数调用必须包含头文件“cmath”(或math.h) :
#include <cmath> 或 #include <math.h>
如果对变量未赋初值,则该变量的初值是一个
不可预测的值。(变量未赋值就使用非常危险。)
cout<<a<<endl;
在变量定义时,对多个变量赋予同一初
值,必须分别指定,不能写成:
float a = b = c = 4.5; 
而应写成 :
float a = 4.5 , b = 4.5 , c = 4.5;
或
float a , b ;
float c=a=b=4.5;
2.3.5 常变量
例如: const int pi = 3.1415;
const表示定义常变量,变量的值在程序
运行期间不能改变。
注意:
1、在定义常变量时必须同时对它初始化。
2、常变量不能出现在赋值号的左边。
const int pi;

pi = 3.1415;
#define命令定义的符号常量与const定义的常
变量的区别:
1、 #define定义的符号常量只是用一个符号
代替一个常量值,在预编译时把所有符号常量
替换为所指定的字符串,在内存中并不存在以
符号常量命名的存储单元。
2、 const定义的常变量具有变量的特征,有
类型,在内存中存在着以它命名的存储单元。
与一般变量惟一的不同是指定变量的值不能改
变(只读)。
(通常可用来定义函数参数)
2.4 C++的运算符
C++的运算符十分丰富,使得C++的运
算十分灵活方便。C++提供了以下运算符:
(1) 算术运算符
+(加)-(减) *(乘) /(除) %(整除求
余)++(自加) --(自减)
(2) 关系运算符
>(大于)<(小于) ==(等于)>=(大于
或等于)<=(小于或等于)!=(不等于)
(3) 逻辑运算符
&&(逻辑与) ||(逻辑或) !(逻辑非)
(4) 位运算符
<<(按位左移) >>(按位右移) &(按位与) |(按位或)
∧(按位异或) ~(按位取反)
(5) 赋值运算符 (=及其扩展赋值运算符)
(6) 条件运算符 (?:)
(7) 逗号运算符 (,)
(8) 指针运算符 (*)
(9) 引用运算符和地址运算符 (&)
(10) 求字节数运算符(sizeof)
(11) 强制类型转换运算符( (类型) 或类型( ))
(12) 成员运算符 (.)
(13) 指向成员的运算符 (->)
(14) 下标运算符 ([ ])
(15) 其他 (如函数调用运算符())
由以上运算符与常量、变量或函数
一起构成的每个表达式,在求值后
都有一个确定的值。
2.5 算术运算符与算术表达式
2.5.1 基本的算术运算符
++、- -、+(正号)、 -(负号)
*(乘)、/(除)、%(取余)
+(加法)、 -(减法)
优
先
级
高
到
低
(1)/(除)
例:5/2 值为: 2
9/2
值为: 4
若 / 的两操作数都为整数,则为整除。
例:5/2.0
5.0/2
5.0/2.0
值为:2.5
若 / 的两操作数中有一个浮点数,则为
正常的整法运算。
例:
int i = 15;
float f;
f = i / 10;
结果为:f = 1
如果希望 f 的结果为1.5 ,则可将第三条语句改为:
f = (float) i /10 ; 或 f = i /10.0;
例:在C++中, (7/3+1)+5/6 的值是( 3 )
(2) % (取余)
要求 % 的两操作数必须为整数,不允
许对浮点数操作。
例:3 % 4=3
4 % 4=0
4 % -3=1
 余数的符号与被除数相同。
n = 40 % 5
0
n = 40 % 7
5
n = - 40 % 7
-5
n = - 40 % - 7
-5
- 4 % 3= - 1
2.5.2 算术表达式和运算符的优先级与结合性
运算对象包括常量(数值常量、字符常量,不能
对字符串常量进行运算) 、变量、函数等。
a*b/c-1.5+’a’
 a*b/c-1.5+’ab’

在求解表达式时,先按一个运算对象两侧的运
算符的优先级别高低次序执行。
a-b*c
如果在一个运算对象两侧的运算符的优先级
别相同, 则按“自左至右”结合,如
a-b+c
书后附录B:运算符与结合性
2.5.3 表达式中各类数值型数据间的混合运算
在表达式中常遇到不同类型数据之间进行运
算,如:
10 + ’ a’+1.5 - 1.4 * ’A’
在进行运算时,不同类型的数据要先转换成同
一类型,然后进行运算。转换的规则按图所示。
假设已指定i为整型变量,f为float变
量,e为long型,有下面表达式:
10+‘a’+ i * f – i / e
10+‘a’+ i * f – i / e

 

1

(上述的类型转换是由系统自动完成的)
例: 1.5+ 32/5 的值是( 7.5)
例: (1.5+ 32)/ 5的值是( 6.7)
2.5.4 自增和自减运算符( ++ 、-- )
(1)、a++ :先取a的值作为表达式的值,然
后a=a+1
例:int a; a = 2 ; j = a++ 结果为:j=2 , a=3
(2)、++ a :先a=a+1 , 然后取a的值作为表达
式的值。
例:int a; a = 2 ; j = ++a 结果为:j=3 , a=3
(3)、 a -- :先取a的值作为表达式的值,然后
a=a-1
例: int a; a = 2 ; j = a-- 结果为:j=2 , a=1
(4)、 -- a :先a=a+1 , 然后取a的值作为表达式
的值。
结果为:j=3 , a=3
例: int a; a = 2 ; j = --a
例:写出下列程序运行结果:
int a = 3;
int b = ++a;
cout<<a<< " "<<b<<endl;
int c = a++;
cout<<a<< " "<<c<<endl;
答案:4 4
5 4
#include<iostream>
using namespace std;
int main()
{
12
20
int i , j , m , n; 答案:10
i=8;
注意:
j=10;
后置++、--的优先级
m=++i+j++;
高于前置++、-n=i+++j;
cout<<i<<'\t'<<j<<'\t'<<n<<endl;
return 0;
}
正确地使用++和--,可以使程序简洁、清晰、
高效。
请注意:
(1)自增(减)运算符只能用于变量,而不能用
于常量或表达式。(5++ 、(a+5)++、a++)



(2)自增(减)运算符使用十分灵活,但在很多情
况下可能出现歧义性,产生“意想不到”的副作用。
(3) 自增(减)运算符在C++程序中是经常见到
的,常用于循环语句中,使循环变量自动加1。
也用于指针变量,使指针指向下一个地址。
2.5.5 强制类型转换运算符
在表达式中不同类型的数据会自动地转换
类型,以进行运算。
利用强制类型转换运算符将一个表达式转换
成所需类型。例如:
(double)a
(将a的值转换成double类型)
(int)(x+y)
(将x+y的值转换成整型)
(float)(5/2)
(2.0)
(float)5/2
(2.5)
强制类型转换的一般形式为:
(类型名)(表达式)
C++还增加了以下形式:
类型名(表达式)
注意:这种写法表达式的括号不能省略。
类似于函数调用的写法。
如int(x) 、int(x+y)、float(5)/2
例2.4 强制类型转换。
#include <iostream>
using namespace std;
int main( )
输出结果:
{ float x=3.6 , f;
x=3.6,i=3
int a=16 , b=5 , i;
a=16,f=19
i = (int)x;
f=(float)a+a/b;
cout<<″x=″<<x<<″,i=″<< i<<endl;
cout<<″a=″<<a<<″,f=″<< f<<endl;
return 0;
}
1、如定义int e=8;double f=6.4,g=8.9;则表达式
f+int(e/3*int(f+g)/2)%4的值为(9.4 )
2、若变量a已说明为float类型,i为int类型,则下
列哪几个表达式能实现将a的数值保留小数点后
两位,第三位进行四舍五入的运算。( B、C )
A) a=(a*100+0.5)/100.0;
B) i=a*100+0.5;a=i/100.0;
C) a=(int)(a*100+0.5)/100.0;
D) a=(a/100+0.5)*100.0;
2.6 赋值运算符与赋值表达式
2.6.1 赋值运算符( = )
作用是将右边的数据赋给左边的一个变量。
如“a=3”,把常量3赋给变量a。
双目运算,从右到左。如d=a=b
赋值操作是一个表达式,每个表达式在求值后都
有一个确定的值,其值为赋值号左边表达式的值:
例:cout<<(x=5)<<endl;
2.6.2 赋值过程中的类型转换
当赋值运算符两边类型不一致时,根据左边的
类型进行自动转换(数值型或字符型) 。
(1) int i; float f=3.6; i=f; cout<<i<<endl; 3
(2) int i=3; float f=3.6; f=i; cout<<f<<endl;3
(3) char i=‘A’; float f=3.6; f=i; cout<<f<<endl;65
注意:short a=10; float b=70000.5; a=b;
将b的值70000.5赋给a,但70000.5超过short
的取值范围,超过的部分将会扔掉。运行结果将会
出错,但编译不会提示出错。
(4) 将一个int、short或long型数据赋给一个
char型变量,只将其低8位原封不动地送到char
型变量(发生截断)。例如
short int i=289;
char c;
c=i;
//将一个short int型数据赋给一个
char型变量
设有语句int a=258,b;unsigned char c;b=c=a;
则b的值是( 2 )
(6) 将signed(有符号)型数据赋给长度相同的
unsigned(无符号)型变量,将存储单元内容原样
照搬(连原有的符号位也作为数值一起传送)。
例2.5 将有符号数据传送给无符号变量。
#include <iostream>
运行结果为:
using namespace std;
65535
int main( )
{ unsigned short a;
short int b=-1;
a=b;
cout<<″a=″<<a<<endl;
return 0;
}
2.6.3 复合的赋值运算符
凡是二元(二目)运算符,都可以与赋值符一
起组合成复合赋值符。C++可以使用以下十种复
合赋值运算符:
+=,-=,*=,/=,%=
<<=,>>=,&=,∧=,|=
其中后5种是有关位运算的。
例如,可以有
a+=3
等价于 a=a+3
x*=y+8
等价于 x=x*(y+8)
x%=3
等价于 x=x%3
① a+= b
(其中a为变量,b为表达式)
② a+= (b ) (将有下划线的“a+”移到“=”右
侧)
③ a = a + ( b ) (在“=”左侧补上变量名a)
注意,若b只有一个值,则括号可以省略;如果
b是包含若干项的表达式,则必须有括号。如
① x %= y+3
② x %= (y+3)
③ x = x%(y+3)(不要错认为x=x%y+3)
2.6.4 赋值表达式
由赋值运算符将一个变量和一个表达式连接起
来的式子称为“赋值表达式”。
它的一般形式为
<变量> <赋值运算符> <表达式>
下列哪些赋值语句正确:
int a=3,b=4,c=6;
const int d=10;
a+b=c; c=a+b=c; c=a+(b=c)

d=a;
3=b;
a=b=d;

 


左侧的变量可以出现在赋值运算符右侧的表达
式中。如
a=a+5
下面是赋值表达式的例子:
(赋值表达式值为5,a,b,c值均为5)
a=b=c=5
(表达式值为11,a值为11,c值为6)
a=5+(c=6)
a=(b=4)+(c=6) (表达式值为10,a值为10,b等于4,c等于6)
a=(b=10)/(c=2) (表达式值为5,a等于5,b等于10,c等于2)
a=6; a+=a-=a*a; (相当于a=a+(a=a-a*a),表达式的结果为-60)
请分析下面的赋值表达式:
(a=3*5)=4*3 
因为a=3*5的结果为a,再将4*3的结果给a,
所以最后a=12,表达式的结果为12。
如果写成如下形式:
a=3*5=4*3
因为3*5不是左值,不能出现在赋值运算符的左侧。
赋值操作不仅可以出现在赋值语句中,而且
可以以表达式形式出现在其他语句(如输出语
句、循环语句等)中。这是C++语言灵活性的
一种表现。
请注意,用cout语句输出一个赋值表达式的
值时,要将该赋值表达式用括号括起来,如果
写成“cout<<a=b;”将会出现编译错误。
2.7 逗号运算符与逗号表达式
表达式的一般形式为
表达式1,表达式2,表达式3,…,表达式n
求解顺序:依此求解表达式1、2、3…n的值,整
个逗号表达式的值是表达式n的值。
如,逗号表达式
a=3*5 , a*4 整个表达式的值为60,a=15
注意:逗号运算符的优先级是最低的。
一个逗号表达式又可以与另一个表达式组成
一个新的逗号表达式,如
(a=3*5,a*4),a+5
① x=(a=3,6*3) 表达式的结果为18,a=3,x=18
② x=a=3,6*3 表达式的结果为18,a=3,x=3
在用cout输出一个逗号表达式的值时,要将该
逗号表达式用括号括起来,如
cout<<(3*5,43-6*5,67/3)<<endl;
输出22
本章到此结束
谢 谢!