2009-7-28 1
第 2章数据类型、运算符和表达式
2009-7-28 2
程序 是由一行行符号序列表达的,空格将符号序列分为六类:
关键字,include,int,const等说明语句、数据的性质;
标识符,tree,language,a,b等代表运算对象;
运算符,<<,+,==等表示指定运算;
常量,2.45等,不用说明,是有类型的操作数;
串:,Hello Worls‖等用双引号括起来的字符序列;
特殊符号,{,},//,#,(,)等
2009-7-28 3
关键字又叫 保留字,是预先定义好的,被系统占用的标识符,具有特定的含义。
注:
一般标识符不能取关键字
关键字要小写
2009-7-28 4
C++共有 48个关键字,C++与 VC++兼容的有 43个。
C 和 C++ 都有 (常用)
int,float,char,struct,union,const,static、
long,short,unsigned,signed,void,enum、
extern,double,typedef。
for,if,else,while,do,switch,case、
default,break,continue,return,goto
例 1,int x; float a; const pi=3.1415;
if(a= =b) x=a;
else x=b;
2009-7-28 5
C++ 特有的关键字 (常用)
class,定义类;
public,private,protected,
定义公共,私有,保护属性和服务;
friend,定义友元;
operator,定义运算符;
inline,定义内联函数;
virtual,定义虚函数;
template,定义模板;
new,delete,分配和消除存储空间
this,指向自己的指针
2009-7-28 6
标识符,由程序设计者确定的名字。包括:常量名、变量名、
函数名、类名等等。
标识符的构成,
一系列字母、数字 和下划线 组成,首字符必须是字母或下划线;
不能是关键字;
大小写有区别;
如,under_bar,m9909,_1234,t5,b7,Bb等等例 2,const pi; 中的 pi
int x; 中的 x
void add( ); 中的 add
class student{……}; 中的 student
下列是不合法的:
break,3var,a fool,.name,……
2009-7-28 7
习惯上取有意义的名字,如 sum,aver
等,尽量不要重名,为变量取名字一般用小写。
注意:
在标识符里区分大小写字母例,name
Name
NAME
为不同标识符
2009-7-28 8
问题,下列哪些是正确的标识符?
Her_sales ( )
MyAdd ( )
9_class ( )
class_9 ( )
class 9 ( )
2h ( )
问题?能否用关键字作标识符?
答案,不能! (为什么?)
2009-7-28 9
运算符,算术运算符,+,—,* 等关系运算符,<,= = 等逻辑运算符,&&,|| 等赋值运算符,=
流运算符,<<,>>
例 3,x+y,x*y
x= =y
x && y
x=y
cout << "c++";
2009-7-28 10
常量,? 常量 分 字面常量 和 标识符常量 (又称符号常量 )。
字面常量 含 整型常量、实型常量、字符型常量、
字符串常量。
例 4,下列常量是合法的:
+400,-54,0 十进制整型常量
034,0X20或 0x20 八进制和十六进制整型常量
10L,39U,43UL 或 10l,39u,43lu
长整型、无符号型及无符号长整型常量
3.1415926,0.0,.23 十进制实型常量
32E10,43e-5 科学表示法实型常量
,this is a string‖,,13254‖ 字符串常量
‘ a‘,‘ A‘,‘ @‘,‘ ’,‘ ^‘ 字符型常量
‘ \032‘,‘ \a‘,‘ \\‘,‘ \‘‘,‘ \x35‘ 转义字符型常量转义字符后的整型常量是一个取值在 0~255间的八进制或十六进制整数。
2009-7-28 11
常量 是指在程序运行过程中,其值不变的量。
(1) 整型常量,不带小数点的整常数十进制,不能用数字 0开头; 0~9、正、负号组成例,123,-10
八进制,必须以数字 0开头; 0~7组成例,0122,023,067
十六进制,必须以 0x或 0X开头,0~9,a~f (A~F)
例,0x2a,0x4f
长整型常量,在整常数后加 l (或 L)
例,123L,034L,0x2fL
2009-7-28 12
( 2)实型常量,又称浮点数
※ 十进制小数形式 (小数表示法),由符号、数字和小数点组成 (必须有小数点)如,123,0.123
※ 指数形式(科学计数法):
由数符、尾数(整数或小数)、阶码标志 e(E)、阶符、整数阶码构成如,-123e-3,1.23e5 而 12.e,e-5非法注:实型常量缺省为双精度 (double)型若要表示 float型需在实数后加 f。 例,12.3f
2009-7-28 13
( 3)字符型常量:
一般字符常量,单引号括起来的单个字符 (单引号是定界符,不是常量本身 ),其值为 ASCII代码值。
例,‘ a?,?A?,?#?都是合法字符常量
‘ A?的值为 65 10,0101 8,0x4116,010000012
字符数据和整型数据可以通用转义字符,不能从键盘上直接输入以 \ 开始的字符序列,用于表示控制代码及某些用于功能定义的字符。
2009-7-28 14
C++中预定义的转义序列字符及其含义转义字符 名称 功能或用途
\a 响铃 用于输出
\b 退格 用于退回一个字符
\f 换页 用于输出
\n 换行符 用于输出
\r 回车符 用于输出
\t 水平制表符 用于输出
\v 纵向制表符 用于制表
\\ 反斜杠字符 用于输出或文件的路径名中
\‘ 单引号 用于需要单引号的地方
\‖ 双引号 用于需要双引号的地方
2009-7-28 15
( 4)字符串常量,双引号括起来的一串字符。
例:,3a9d#=s”,2天津 ABC”
3 a 9 d # = s \0
存储,依次存放各自的 ASCII码,尾部自动加字符串结束标志‘ \0?,即:
a?,字符常量,存储其 ASCII码值,占据一个字节。
长度,为其本身的长度。
“a”,字符串常量,占据两个字节,即,a 与 \0 的
ASCII码值。
2009-7-28 16
C++中常量可以是常数,也可以是代表固定不变的值的名字 ——符号常量 。比如程序中经常用到某个常数,此时可以定义一个名字来表示此常数,以便改进程序的可读性。例如计算圆面积或圆周长要用到 3,1415926(不能直接用?),可定义为符号常量。
定义符号常量一般形式:
#define 符号常量 表达式例如,#define PI 3.1415926
2009-7-28 17
标点符号,共 9个。 #,(,),{,}、,,,,;,… 。
分隔符,? 如 ; {,},//,/*,*/,空格 等等 。
变量和常量的区别,变量 —— 存储单元;
常量除串外,不占存储单元,也不能改变
#define MAXSIZE 20
#define A ―I am a student‖
const float s=100
其中 MAXSIZE,A,s均为标识符常量下列常量是不合法的:
E10,.e30,1.8E2.4,‘ \‘,‘’’ 等。
2009-7-28 18
例 5,常量与分隔符的使用。
#include <iostream.h>
void main( )
{
const float pi=3.1415926; //pi 的值
float r;
r =1.0;
float x=r*r*pi; /* 计算面积 */
cout << x << endl;
}
2009-7-28 19
VC++基本数据类型字符 char
整数 int
实数 float
短整数 short int
长整数 long int
双精度 double
无符号整数
unsigned int
类 型 大小 取值范围
1字节
4字节
4字节
2字节
4字节
8字节
4字节
256个 (-128~127)字符
-231~(231-1)
-1e+38 ~ 1e+38
-32768 ~ 32767
-231~(231-1)
-1e+308~1e+308
0 ~ (232-1)
2009-7-28 20
VC++的 其它 数据类型指针 *
引用 &
数组 [ ]
函数 ( )
结构 struct
枚举 enum
类 型 举 例
int *p; //定义指针变量 p
int &s=a; //定义 a 的引用 s
int b[10]; //定义数组变量 b
void print( ); //定义函数 print
注意,可以用 sizeof( )函数求数据类型的内存大小,如 sizeof(float) 将得到 float 类型的长度 4。
2009-7-28 21
类型的作用:确定分配空间的大小和所能进行的操作。
修饰符,signed,unsigned,long,short,const
占用空间操作复杂性
2009-7-28 22
常 量 类 型
const 标识符在其作用域内不能改变注意,在大型软件开发中常量类型很重要为什么,1,防止在函数体内改变参数的值
2,减小程序出错的可能性
3,提高程序的可维护性例 6,const int buf=512;
const int d[ ]={1,2,3,4};
buf=333; //出错,因为是常量
d[2]=12; //出错,因为是常量
2009-7-28 23
void print( const int v)
{
cout << v << endl; //输出
v++; //出错,常量不能改变其值
}
作用,将参数声明为常量,使在函数的调用过程中,参数不被改变。
在软件的实际开发中很有用。
2009-7-28 24
变量 是在程序执行过程中其值可以改变的量。
主要用来存放数据。如变量名,其命名同标识符。
值,存储空间的值。
类型,决定为该变量分配多大的存储空间,
决定该变量可参与何种运算。
使用,先定义,后使用。
int i=3,j=5; i
j
3
5
变 量
2009-7-28 25
变量的定义:
<数据类型名 > <变量名表 >;
例,int i,j,k;
long l1,l2;
float x,y,z;
double t1,t2;
注意:
不同类型变量不要写在同一行,以增加程序可读性;
在程序同一部分不允许有同名变量;
以分号结尾。
2009-7-28 26
t v
t v[ ]
t *v
t *v[ ]
t &v
t v( )
t *v( )
变量定义形式(其中 t 为类型,v 为变量名)
形式 语 义 示 例类型为 t 的变量
t 型数组指向 t 型的指针
t 型指针数组
t 型的引用返回类型 t 的函数返回指向 t 型指针的函数
int a
float b[ ]
int *p
int *p[ ]
int &a
void f( )
void *f( )
2009-7-28 27
例 7,类型的定义、引用和指针运算
int a=1,b; //定义整型变量 a,b,将给 a赋初值
b=50; //给变量 b赋初值
int &s=a; //定义 a 的引用 s,即 a 的别名
float f[10]; //定义实数数组 f[10]
int *p[10]; //定义指针数组
int *pi; //定义指针
s=s+1; //s 的值加 1,同样 a 的值也加 1
pi = &a; //将 a 的地址赋给 pi
pi = &s; //将 s 的地址赋给 pi
cout << " a= " << a << " s= " << s
<< " *pi= " << *pi;
结果,a=2 s=2 *pi=2
2009-7-28 28
运 算 符要点:
1,运算功能,能做什么
2,运算对象的限制:
运算对象的个数,如 + 为双对象(双目)
类型的限制,求余运算 %只能用 int
值的限制,除数非零
3,运算优先规则多个运算符的运算次序。
4,结合规律多个运算符的结合次序。
如,2*6/2 从左到右,称 右结合 。
x=y=z=2 从右到左,称 左结合 。
5,运算值的类型,结果类型
2009-7-28 29
关系运算符 (6 个,<,<=,>,>=,= =、! =,
运算结果,1=真 ; 0=假 )
优先级 运算符 结合高低输出输入,<< >> >>
< <= > =>
= = !=
赋值,=
左到右左到右左到右右到左例 8,int i=4,j=5,k;
cout << " i>j,"<<(i>j)<< " ; i!=j,"<<(i!=j)<<endl;
cout << " k=i= =j,"<<(k=i= =j)<<endl;
cout<<―k=‖<<(k=i<=j<=3)<<end1;
结果,i>j,0 ; i!=j:1
k=i= =j,0
k=1
问题:括号可否去掉?
2009-7-28 30
逻辑运算符 (3 个,0=假;其它 =真 )
a b a||b 或例 9,int i=4,j=1,k=0;
cout << " ! i," << ! i<< "; i&&k," <<(i&&k)
<< "; j||k," << (i||k) << endl;
结果,! i,0 ; i&&k,0; j||k,1
!a 非 a&&b 与真 真 假 真 真真 假 假 假 真假 真 真 假 真假 假 真 假 假 假优先级?! 为单目运算符,与单目 – 同级,。
&&,|| 在关系运算符之后,从左到右。
2009-7-28 31
逻辑运算优先级别为,
!
&&
||
高低例,判断给定的年份是否为闰年。
闰年,年份能被 4整除而不能被 100整除,或者能被 400整除。
则闰年的逻辑表达式为,
year%4= =0&&year%100!=0 || year%400= =0
2009-7-28 32
算术运算符
-,+,*,/,%,其中 %为 模运算 。
说明,1.当两个整数作‘ /‘运算时,取整数部分。
2.运算‘ %‘只对整数。
3.作‘ /‘运算时,若除数是 0或结果溢出,作出错处理。
整数运算溢出不作出错处理,但结果错误。
例 10,#include <iostream.h>
#include <string.h>
void main(void){
short i=32767,j;
int k;
j=i+1;
k=i+1;
cout<<―i=―<<i<<?\t‘<<―j=―<<j<<?\n‘;
cout<<―k=―<<k<<?\n‘;
}
结果,i=32767 j=-32768
k=32768
2009-7-28 33
位运算符
~ 按位取反 一元运算符
<< 左移 二元运算符
>> 右移 二元运算符
& 按位与 二元运算符
| 按位或 二元运算符
^ 按位异或 二元运算符注,1.~a表示将 a的每一位取反,主要用于求补码等。
2.a<<b表示将 a的二进制数依次向左移动 b位。相当于将 a乘以 2b,但较快。 a>>b类似。
3.a|b或 a&b表示将 a和 b的各位对应作或运算或与运算。
2009-7-28 34
位逻辑运算符及表达式
a b a&b按位与 a|b按位或 ~a按位反 a^b按位异或
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
1
1
1
0
0
0
1
1
0
2009-7-28 35
例,
6&7
1 1 0
1 1 1
1 1 0
例,
6|7
1 1 0
1 1 1
1 1 1
左移运算符一般形式为,
表达式 1<< 表达式 2
其中,表达式 1为 移位对象,表达式 2为 左移的位数例,a= 00001011 则
a<< 3 的值为 01011000
左移一位相当于乘 2
2009-7-28 36
右移运算符一般形式为,
表达式 1>> 表达式 2
其中,表达式 1为 移位对象,表达式 2为 右移的位数例,a= 00001011 则
a>> 3 的值为 00000001
右移一位相当于除以 2
2009-7-28 37
其他运算符
(1) & 和 *
单目运算符,用来实现指针变量的取地址和取值运算,
(2) 强制类型运算形式,(类型名 ) 表达式可利用强制类型转换运算符将一个表达式转换为所需类型例如,n为 int型变量,如果你想让 n/3成为 float类型,可写为:
(float) n/3
(3) sizeof( )
用来计算某类型或变量在内存中所占字节数例,sizeof(int) 的值为 4
2009-7-28 38
C++运算符及其优先级优先级
1 ( ),.,->,[ ],::,*,->*,& (引用) 右结合
2 *,&,new,delete,!,~,++,- -,-,sizeof 左结合
3 *(乘),/,% 右结合
4 +,- 右结合
5 <<,>> 右结合
6 <,<=,>,>= 右结合
7 = =、! = 右结合
8 & (位运算符) 右结合
9 ^(位运算符) 右结合
10 | 右结合
11 && 右结合
12 || 右结合
13?:(三目运算) 左结合
14 =,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|= 左结合
15,(逗号运算符) 右结合
2009-7-28 39
常用复合赋值运算符优先级 运算符 结合高低单目增量,+ +
单目减量,––
赋值,=,+=,- =
*=,/=
右到左与单目 –
同级,
与 =同级
v++ 和 + +v都等价于 v=v+1,但意义不一样
v –– 和 ––v都等价于 v=v-1,但意义不一样
v+= i 等价于 v=v+ i; v – = i 等价于 v=v – i;
v*= i 等价于 v=v*i; v/=i 等价于 v=v/i;
注意,单目优先于双目
2009-7-28 40
+ +v称为前置增量,
先进行增量运算,
再取其值参与其它运算
v+ +称为后置增量,
先取其值参与其它运算,再对 原值 进行增量运算结果? 2; 5
2; 6
例 11,int i=1,j=5;
cout << + + i << "; " << j+ + <<endl;
cout << i << "; " << j <<endl;
2009-7-28 41
表达式表达式包括 算术表达式,关系表达式,逻辑表达式 和 逗号表达式 。
算术表达式由算术运算符、括号、操作数构成的式子。
如,int a=25,b=4,c=3,s,t,k;
a+b*c; //结果为 37
a*-b; //因,-‖的优先级高于,*”,故结果为 -100
s=a*--b; //等同于 a*(-(-b)),计算结果为 100
t=c+b/k; //出错,因为 k没有定义初值
cout<<―s=‖<<s<<end1;
2009-7-28 42
关系表达式由关系运算符将操作数连接起来的式子。
如,a+b>c+c
c<=b<=e
逻辑表达式由逻辑运算符连接起来的式子。
如,a<b&&c<b||4+3*!a
!a>=b||!c>=b
2009-7-28 43
赋值表达式将一个数值或一个表达式的值用,=‖赋给一个变量。
二元算术运算符和位运算符与赋值运算符组合成的运算符称为 复合赋值运算符 。共有十个,+=(加等 ),-=,*=,/=、
%=(求余等 ),<<=(左移等 ),>>=(右移等 ),&=(与等 ),^=(异或等 ),|=(或等 )。
如,a+=b+5 即 a=a+(b+5)
a*=b 即 a=a*(b)
a*=b-c 即 a=a*(b-c)
逗号表达式用逗号运算符连接起来的表达式。
一般形式,<表达式 1>,<表达式 2>,…,<表达式 n>
即按从左到右的顺序依次求出各表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。
2009-7-28 44
例 12,设 b=2,c=3,d=4,则下列逗号表达式
a=5+5,b=b*b+c,d=d*a+b
的值为 47。
y=x=(a=3,6*3) 结果,x=y=18,a=3
y=x=a=3,6*3 结果,x=y=a=3
y=(x=a=3,6*3) 结果,x=a=3,y=18
注:逗号有时只是一个分隔符。如:
max(a+b,c+d)
不同类型数据的混合运算和赋值时的类型转换当二元运算中的两个操作数类型不同或赋值运算时表达式与变量的类型不同时,C++先进行类型转换再进行运算。
2009-7-28 45
转换的方法有两种:一种是 自动转换,一种是 强制转换 。
(1) 系统自动转换:
long
char,shortint
unsigned
double float
低高
char向 unsigned int转换
2.当操作数不同时,系统进行的转换
float向 double 转换
1.必定转换:
小空间向大空间转换
2009-7-28 46
自动转换发生在不同数据类型的量混合运算时,
由编译系统自动完成。自动转换遵循以下 规则,
1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2.转换按数据长度增加的方向进行,以保证精度不降低。 如 int型和 long型运算时,先把 int型转成
long型后再进行运算。
3.所有的浮点运算都是以双精度进行的,即使仅含 float单精度量运算的表达式,也要先转换成
double型,再作运算 。
2009-7-28 47
4.char型和 short型参与运算时,必须先转换成 int型。
int unsigned long duble
例 13,char c1,c2;
int i1,i2;
float x1,x2;
x2=c1*i1+c2*c1+i2*x1;
计算过程如下:
c1转换为整型 计算 c1*i1
其值设为 t1
c1,c2
转换为整型计算 c1*c2
其值设为 t2
计算 t1+t2
其值设为 t3
i2,x1转换为双精度型实数 计算 i2*x1
其值设为 t4
t3转换为双精度型实数 计算 t3+t4
结果为双精度型实数
2009-7-28 48
‘A’ + 32 + 7.23 * 6 - 5 / 3
int intdouble
double运算结果的类型为:
2009-7-28 49
5.在赋值运算中,赋值号两边量的数据类型不同时,赋值号 右边 量的类型将 转换为 左边 量的类型 。 如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
2009-7-28 50
( <type>) <表达式 >或 <type>( <表达式 >)
例 15,int a=16,b=5,i;
float x=10;
x=(float)a+a/b;
运算结果,19
(2)强制转换:
操作数:可以是常量、变量、函数、表达式若为表达式,则要用括号将表达式括起来
2009-7-28 51
1.6666671.000000
float x;
int i;
x=3.6;
i=(int) x;
x=3.60000
i=3
例如,(float)(5/3) (float)5/3
2009-7-28 52
赋值类型转换和逻辑表达式优化时的副作用
1.类型转换后可能影响求值精度;
如,int i,j;
float x,y;
x=(i=4.8)+(j=5.9) 其值为 9.0,而不是 10.7
2.逻辑表达式的优化是指计算过程中,一旦能确定其值,
就不再继续。因而有可能得到错误结果。
如,a&&b++&&--c 当 a为 0时,表达式的值为 0
d||e++||f++ 当 d不为 0时,表达式的值为 1
int a=16,b=10,i;
float x=10;
i=a<b&&(x=25)>b;
cout<<―i=‖<<i<<?\t‘<<―x=―<<x<<?\n‘;
输出结果,i=0 x=10
2009-7-28 53
课堂总结
标识符的构成。
关键字,C和 C++共有的,C++特有的。
变量的定义形式及作用域。
运算符的 5个要点。
运算符的优先级及其应用,包括:算术运算符、关系运算符,逻辑运算符、常用复合赋值运算符。
表达式的运算。
VC++中的基本数据类型。
2009-7-28 54
赋值运算符 与 赋值表达式逗号运算符 与 逗号表达式逻辑运算符 与 逻辑表达式算术运算符 与 算术表达式低高关系运算符 与 关系表达式