第 2 章 数据类型、运算符与表达式

59
1 第 2 第 第第第第 第第第第第第第 第第第第第第第第第第第 第第第第第第第第第第第第 第第第 ,, C++ 第 第第第第第第第第 第第第第第第第第 第第第第 第第第第第第第第第第第第第 第第第第 。一,、 第第第第第第第第第第第第第第第第第第第第第第 C++ 第第第第第 第第第第第 第第第第第第第第第

Upload: ofira

Post on 18-Mar-2016

149 views

Category:

Documents


4 download

DESCRIPTION

第 2 章 数据类型、运算符与表达式. 数据指能输入到计算机中,并能被计算机处理的对象,数据是 C++ 程序处理的基本单元。类型是对数据的一种抽象,不同类型的数据其表示方法、所占存储空间的大小及定义在其上的操作是不同的。 本章介绍: C++ 的数据类型 基本运算符 表达式语句和空语句. 2.1 C++ 的数据类型. C++ 语言的数据类型包括 基本数据类型、派生类型和类类型 。基本数据类型是系统预先定义的、可直接使用的数据类型;派生类型是从基本类型派生出的新类型;类类型是通过组合现存类型而生成的新类型。 C++ 的字符集: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 2 章  数据类型、运算符与表达式

1 前一页 休息

第 2 章 数据类型、运算符与表达式 数据指能输入到计算机中,并能被计算机处理的对象,数据是 C++ 程序处理的基本单元。类型是对数据的一种抽象,不同类型的数据其表示方法、所占存储空间的大小及定义在其上的操作是不同的。本章介绍:

C++ 的数据类型 基本运算符 表达式语句和空语句

Page 2: 第 2 章  数据类型、运算符与表达式

2 前一页 休息

2.1 C++ 的数据类型 C++ 语言的数据类型包括基本数据类型、派生类型和类类型。基本数据类型是系统预先定义的、可直接使用的数据类型;派生类型是从基本类型派生出的新类型;类类型是通过组合现存类型而生成的新类型。 C++ 的字符集:( 1 ) 26 个英文字母( C++ 中大写和小写表示两个不同的字符)( 2 ) 10 个阿拉伯数字( 0 - 9 )( 3 )其它特殊符号(汉字是特殊符号)

- 以运算符为主( + 、 - 、 * 、 / 、 = 、!等)- 10 个标点符号( ' 、 " 、(、)、 { 、 } 、,、:、;、…)- 分隔符(运算符、空格、标点符号、回车键、 Tab 键)

Page 3: 第 2 章  数据类型、运算符与表达式

3 前一页 休息

2.1.1 关键字 关键字 (keyword) 又称保留字,是系统预先定义的、具有特定含义的标识符。标准 C++ 中预定义了 63 个关键字。

asm default float operator static_cast union

auto delete for private struct unsigned

bool do friend protected switch using

break double goto public template virtual

case dynamic_cast if register this voidcatch else inline reinterpret_cast throw volatilechar enum int return true wchar_tclass explicit long short try whileconst export mutable signed typedef

const_cast extern namespace sizeof typeid

continue false new static typename

Page 4: 第 2 章  数据类型、运算符与表达式

4 前一页 休息

2.1.2 标识符 标识符是由若干个字符组成的字符序列,用来命名程序中的一些实体。如常量名、变量名和函数名等。标识符的书写规则: 由字母( a ~ z , A ~ Z )、数字( 0 ~ 9 )或下划线( _ )组成。 必须以字母或下划线开头。 例如: example1 , My_Message , Mychar , thistime 非法: 8key , b-milk , -home 最多由 247 个字符组成。 在标识符中,严格区分大小写字母。 例如: book 和 Book 是两个不同的标识符。 关键字不能作为自定义的标识符,但是标识符中可包含关键字。 例如: int1, INT 一个写得好的程序,标识符应该尽量有意义。

Page 5: 第 2 章  数据类型、运算符与表达式

5 前一页 休息

2.1.4 分隔符 分隔符用来分隔 C++ 语言中的语法单位,表示前一语法实体的结束和另一个语法实体的开始。在不同的词法符号之间必须用分隔符隔开。 在 C++ 中起分隔符作用的符号有:空格符、制表符、换行符、注解符、运算符和标点符号。

Page 6: 第 2 章  数据类型、运算符与表达式

6 前一页 休息

2.1.5 C++ 的基本数据类型

字符型 char 整型 int 基本数据类型 单精度型 float 双精度型 double 无值型 void 数据类型 数组型 结构型 导出数据类型 联合型 指针型 类类型

修饰符: signed, unsigned, long, short 可加在 char 或 int 前

Page 7: 第 2 章  数据类型、运算符与表达式

7 前一页 休息

数据类型决定了数据所占存储空间的大小、存储方式及值的范围,这些可能与机器有关。

Page 7

基本数据类型及其表示范围:基本数据类型 存储空间 / 字节 值域范围

short int 2 -32768~32767signed short int 2 -32768~32767unsigned short int 2 0~65535int 4 -2147483648~2147483647signed int 4 -2147483648~2147483647unsigned int 4 0~4294967295

2.1.5 C++ 的基本数据类型

Page 8: 第 2 章  数据类型、运算符与表达式

8 前一页 休息

2.1.5 C++ 的基本数据类型long int 4 -2147483648~2147483647

signed long int 4 -2147483648~2147483647

unsigned long int 4 0~4294967295

char 1 -128~127

signed char 1 -128~127

unsigned char 1 0~255

float 4 -3.4×1038~3.4×1038

double 8 -1.7×10308~1.7×10308

long double 10 -3.4×104932~3.4×104932

Page 9: 第 2 章  数据类型、运算符与表达式

9 前一页 休息

常量是指在程序执行的整个过程中始终保持不变的量。常量分为:整型常量,字符型常量,浮点型常量和字符串常量。

2.1.6 常量

整型常量 整型常量即整数,包括长整数 (long) 、有符号整数 (int) 和无符号整数 (unsigned int) 。 C++ 中通过在整数后面加上一些特殊字符作为后缀来限定数据类型。

- 后缀字符 u 或 U 表示无符号整数- 后缀字符 l 或 L 表示长整数- 后缀 l 或 L 与 u 或 U 的组合表示无符号长整数

Page 10: 第 2 章  数据类型、运算符与表达式

10 前一页 休息

整数有三种表示形式: 十进制整数。十进制整数。除表示正负数的符号外,以 除表示正负数的符号外,以 11 ~~ 9 9 开头,开头,由 由 00 ~~ 9 9 组成的数。组成的数。例如:例如: 128 +234 -278 2002u 123uL 123lu 128 +234 -278 2002u 123uL 123lu 八进制整数。八进制整数。以 以 0 0 开头,由 开头,由 00 ~~ 7 7 组成的数。组成的数。例如:例如: 0126 050000L 060002u0126 050000L 060002u 。。 十六进制整数。十六进制整数。以 以 0X 0X 或 或 0x 0x 开头,由 开头,由 00 ~~ 99 、、 A~F A~F 或或 a~f a~f 组成的数。组成的数。例如:例如: 0x12A 0x5a000L 0xF0002u0x12A 0x5a000L 0xF0002u思考:思考: 0909 是哪种类型的整数?是哪种类型的整数?

+07+07 是合法的八进制整数吗?是合法的八进制整数吗?

2.1.6 常量

Page 11: 第 2 章  数据类型、运算符与表达式

11 前一页 休息

2.1.6 常量 浮点型常量 浮点型常量即实数。包括单精度( float )数、双精度( double )数和长双精度( long double )数。- 定点数表示法。由整数和小数两部分组成,中间用小数点隔开。可用后缀字符 f 或 F 来表示单精度数, l 或

L 表示长双精度数。 例如: 2.718f 0.5 53.69L .45 55. -2.36 不加后缀修饰时,缺省为双精度数。

- 指数表示法 ( 科学记数法 ) 。由尾数和指数组成,中间用E或e隔开。 例如: 3.6E2 1e-10指数表示法必须有尾数和指数两部分,并且指数只能是整数。

一个实型数,总是被假定为 double 型,除非有 F 或 f 后缀,才被处理为 float 型。若有 L 或 l 后缀,则被处理为 long double 型。

Page 12: 第 2 章  数据类型、运算符与表达式

12 前一页 休息

2.1.6 常量4 字节表示 float 数值:

8 字节表示 double 数值:

4 字节

符号位 8 位指数 23 位尾数

8 字节

符号位 11 位指数 52 位尾数……

Page 13: 第 2 章  数据类型、运算符与表达式

13 前一页 休息

字符型常量 字符型常量包括普通字符常量和转义字符常量。- 普通字符常量。用一对单引号将单个字符括起来构成。

例如: 'a' 'A' '*' - 一个字符仅占用一个字节,存放该字符的 ASCII码。

例如: a 的 ASCII码为 97 ,二进制表示为 01 100 001 。

2.1.6 常量

1 字节

符号位 7 位指数

Page 14: 第 2 章  数据类型、运算符与表达式

14 前一页 休息

- 转义字符常量。以’ \’ 开头,后跟表示特殊含义的字符序列。可用于表示控制字符或特殊字符。例如: '\n' '\'' '\\'

'\141' '\x61' '\0'

2.1.6 常量转义字符 名称

\a 响铃\b 退格\f 换页\n 换行\r 回车\t 水平制表\v 纵向制表\\ 反斜杠\’ 单引号\” 双引号

\000 八进制数\xhh 十六进制数

\0 空字符

Page 15: 第 2 章  数据类型、运算符与表达式

15 前一页 休息

2.1.6 常量 字符串常量 字符串常量是由一对双引号括起来的零个或多个字符序列。例如: "This is a C++ Program.\n" "\td" " " ""

"2002\12\22" "你好 "

- 字符串常量与字符常量的存储方式不同。每个字符串常量均以 \0 字符作为字符串结束标志。例如: "Program" , "m" 和 'm' 的存储方式如图示。

- 字符串常量和字符常量所能进行的运算不同。例如: "m" + "n" 是非法运算,而 'm'+'n' 是合法运算。

P r o g r a m \0m \0m

Page 16: 第 2 章  数据类型、运算符与表达式

16 前一页 休息

2.1.7 2.1.7 变量变量 变量是指在程序运行过程中可以修改的量。变量具有三个基本要素:变量名、变量的类型和变量的值。 变量名用标识符表示。标识了一个数据的存储空间。每个变量均由编译程序为其分配若干个字节的内存单元,以便保存该变量的值。 变量有唯一确定的数据类型。类型决定了变量的存储方式、取值范围及在其上可执行的操作。 变量应先定义,后使用。 变量只能定义一次。 变量应当先赋值,后使用。当要改变一个变量的值时,就把变量的新值写入为该变量所分配的内存单元中,称赋值;当使用一个变量的值时,就从该变量所标识的内存单元中读取数据,又称引用。一个变量如果未曾赋值,其值是不确定的。 给变量命名时,应该注意使用有意义的名字。以帮助描述变量所保存的值。最好使用小写字母。

Page 17: 第 2 章  数据类型、运算符与表达式

17 前一页 休息

2.1.7 2.1.7 变量变量 变量的说明

数据类型 变量名 1[=初始值 1], 变量名 2[=初始值 2], ... ; 例如: int a;

float a,b,c,d; int a=4, b=5;

C++ 有效的数据类型,如: int 、char 、 float 、 double 、 long 等

给变量赋初值

- 相同类型的变量可以放在一个说明语句中说明,变量名之间用逗号隔开。- 变量可以在使用之前的任何地方说明。 - 在说明变量的同时给变量指定值称为变量的初始化。初始化时赋予变量的值的类型应与变量的类型一致。

Page 18: 第 2 章  数据类型、运算符与表达式

18 前一页 休息

2.1.7 2.1.7 变量变量 const 型变量

const 型变量只能在说明变量时指定值,一旦初始化后就不允许再修改其值。例如:const float e=2.71828f; //说明 const 型单精度变量 econst int n=2*10; //说明 const 型整数变量 n

下面的语句是错误的:const double pi; pi=3.1415926;

const 型变量一般用于不需要修改变量值的场合。

Page 19: 第 2 章  数据类型、运算符与表达式

19 前一页 休息

2.1.7 2.1.7 变量变量例 2-1 阅读以下程序,给出运行结果。

#include <iostream.h>void main(void){

const int n=6; float x=5.26f; char ch1='m'; int count; count=n; cout<<"n="<<n<<endl; cout<<"x="<<x<<endl; cout<<"ch1="<<ch1<<endl; cout<<"count="<<count<<endl;

}

n=6 x=5.26 ch1=m count=6

执行以上程序后,在屏幕上输出的结果为:

Page 20: 第 2 章  数据类型、运算符与表达式

20 前一页 休息

2.2 基本运算符 运算符也称为操作符,是对程序中的数据进行运算的标志符号。参与运算的数据称为操作数或运算对象。

不同的运算符所完成的运算或操作不同。 不同的运算符操作数的个数、类型不同。根据运算符需要的操作数的个数,可将其分为三种: 单目运算符、双目运算符和三目运算符。 当不同的运算符混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。 在一个表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性确定的。如果一个运算符对其运算对象的操作是从左向右进行的,就称此运算符是左结合的,反之称为右结合的。

Page 21: 第 2 章  数据类型、运算符与表达式

21 前一页 休息

2.2 基本运算符 C++ 语言的运算符很多,本节仅介绍基本运算符的使用。 表 2-3 列出了 C++ 语言中的运算符及其功能。

优先级 运算符 功能及说明 结合性 目数1

( ) 改变运算优先级左结合 双目:: 作用域运算符

[ ] 数组下标

2

! 逻辑非

右结合 单目~ 按位取反++ -- 自增、自减运算符* 间接访问运算符& 取地址+ - 正、负号

3 * / % 乘、除、取余 左结合 双目4 + - 加、减 左结合 双目

… … … … …

Page 22: 第 2 章  数据类型、运算符与表达式

22 前一页 休息

2.2.1 基本运算符 C++ 的基本运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、逗号运算符和 sizeof 运算符。

算术运算符 C++ 语言提供了 7 个算术运算符: + ( 正 ) 、 - ( 负 ) 、 + 、 - 、 * 、 / 、 % 。 / 运算符要求其右边的操作数不能为 0 ,其功能是计算两个操作数的商。当 / 运算符作用于两个整数时,进行整除运算。 % 运算又称模运算,要求两个操作数必须是整数,其功能是求余数。

Page 23: 第 2 章  数据类型、运算符与表达式

23 前一页 休息

2.2.1 基本运算符例如: 3.0/4 3/43%44%4

注意:余数的符号与左操作数的符号相同。例如:3%2=1 -3%2= -1 3%-2=1 -3%-2= -1

= 0.75= 3= 0

= 0

Page 24: 第 2 章  数据类型、运算符与表达式

24 前一页 休息

2.2.1 基本运算符算术运算符的优先级为:单目 + 、 - 高于 * 、 / 、 % 高于 双目 + 、 -

对于同一优先级的运算符,则按照从左到右的顺序进行计算。可用括号 () 来改变运算符的优先顺序。 在 C++ 中进行算术运算时要注意的一个问题是计算过程中的溢出(超出了数据的表示范围)问题。除法运算时,除数为 0 或很小,整数加或乘运算时,操作数过大,都有可能导致溢出。例如: (a1*a2*a3)/(b1*b2*b3) 与 a1/b1*a2/b2*a3/b3 结果可能不同。

Page 25: 第 2 章  数据类型、运算符与表达式

25 前一页 休息

2.2.1 基本运算符 赋值运算符

C++提供了两类赋值运算符,基本赋值运算符和复合赋值运算符。基本赋值运算符为“ =” ,复合赋值运算符有: += 、 -= 、*= 、 /= 、 %= 、 <<= 、 >>= 、 &= 、 ^= 、 |= 。 赋值运算符都是双目运算符,结合性都是右结合,即赋值表达式的运算顺序是从右向左进行的。例如: sum1=sum2=0 相当于 sum1=(sum2=0) 。 赋值运算符左边的操作数必须是左值。例如: x=3+5 // x 是左值 x+3=5 // x+3 不是左值 当同一个变量出现在赋值运算符的两边时,可以用复合赋值运算符表示。复合赋值运算符是一个整体,中间不能用空格隔开。例如: a=a+1 可以写成: a+=1 a=a*b 可以写成: a*=b

赋值运算符的优先级较低,书写时,要注意避免容易误解的写法。例如: a*=b+c 等价于: a=a*(b+c) 可以写成: a*=(b+c)

Page 26: 第 2 章  数据类型、运算符与表达式

26 前一页 休息

2.2.1 基本运算符 赋值运算符的优先级是同级的。

例 2-2 阅读以下程序,给出运行结果。#include <iostream.h>void main(void){ int m,n,a=3,b=3,number; number=237; m=number/5; n=number%5; cout<<"m="<<m<<’\t’; cout<<"n="<<n<<endl; a+=m; b*=n; cout<<"a="<<a<<’\t’; cout<<"b="<<b<<endl; }

求余运算,n=2整除运算,

m=47

程序运行后,输出: m=47 n=2 a=50 b=6

a=a+m=3+47=50

b=b*n=3*2=6

Page 27: 第 2 章  数据类型、运算符与表达式

27 前一页 休息

2.2.1 基本运算符 关系运算符

关系运算符完成数据的比较运算。 C++ 语言提供了 6 个关系运算符: < 、 <= 、 > 、 >= 、 == 、 != 。 关系运算符都是双目运算符,用于比较两个操作数的大小、相等或不相等,其运算结果为 1 或 0 。如果关系式成立则运算结果为逻辑真 ( 用 1 表示 ) ,否则为逻辑假 ( 用 0 表示 ) 。例如:

3>53!=5

关系运算符的优先级为:算术运算符 高于 > 、 >= 、 < 、 <= 高于 == 、 != 关系运算的结果可作为一个整数参与表达式的运算。例如: int i,a=1,b=10,x; x = 5; i = a<=x<=b;

Page 28: 第 2 章  数据类型、运算符与表达式

28 前一页 休息

2.2.1 基本运算符练习: #include <iostream.h>

void main(void){ int a=2, b=3, c=4; cout << (a > 2) << endl; cout << (a < b+c) << endl; cout << (a == 3) << endl; cout << (a=3) << endl; cout << (a>'a') << endl; cout << (a='a') << endl; cout << (b=a==2) << endl; cout << ('a'>'A') << endl; cout << ('b'=='a'+1) << endl; cout << (a*=b) << endl;}

01030970110

Page 29: 第 2 章  数据类型、运算符与表达式

29 前一页 休息

2.2.1 基本运算符 逻辑运算符

C++提供了三个逻辑运算符,用于表示操作数之间的逻辑关系。它们是:与 && 、或 || 、非 ! 。 逻辑非 ! 是单目运算符,对操作数进行取反运算。当操作数为非 0 (逻辑真 ) 时, ! 运算结果为 0 ;反之为 1 。 && 和 || 运算符是双目运算符。当两个操作数都是非 0 (逻辑真 ) 时, && 运算结果为 1 ;否则为 0 。当两个操作数都是 0 (逻辑假 ) 时, || 运算结果为 0 ;否则为 1 。 逻辑运算的结果可作为一个整数再参与逻辑运算、关系运算或算术运算 。 逻辑运算符的运算优先级为: ! 高于 算术运算符 高于 关系运算符 高于 && 高于 || 。

Page 30: 第 2 章  数据类型、运算符与表达式

30 前一页 休息

2.2.1 基本运算符

注意: 1<x<10 应表示为: 1<x && x<10 当前面的表达式可以得出整个表达式的结果时,不必再求后面的表达式。例如: a&&b&&c 当 a 为 0 时,表达式为 0 ,不必计算 b 与 c 。 a||b||c 当 a 为 1 时,表达式为 1 ,不必计算 b 与 c 。

例 2 :当 c= 4 时,以下各式的值是多少?(c=1)&&(c=3)&&(c=5)(c==1)||(c==2) || (c==5)(c!=2) && (c!=4) &&(c>=1)&&(c<=5)

100

例 1 :计算以下各式:!(3>5)5>3 && 6>85>3 || 6>8

101

Page 31: 第 2 章  数据类型、运算符与表达式

31 前一页 休息

2.2.1 基本运算符例 2-3 阅读下列程序,给出运行结果。#include <iostream.h>void main(void){ int width, height, result1, result2, result3; height=3; width=5; result1=height>3 && width>=5 ; result2=height>3 || width>=5; result3=!(width>=5); cout<<"result1="<<result1<<'\t'; cout<<"result2="<<result2<<'\t'; cout<<"result3="<<result3<<endl;} 程序运行后的结果为:

result1=0 result2=1 result3=0

Page 32: 第 2 章  数据类型、运算符与表达式

32 前一页 休息

2.2.1 基本运算符 位运算符

位运算符是用来对二进制位进行运算的算符。位运算的操作数必须是整数。 C++提供了两类位运算符,即按位逻辑运算和移位运算。按位逻辑运算符为: ~ 、 & 、 ^ 、 | ;移位运算符为: << 、 >> 。( 1 )按位逻辑运算符 按位逻辑非“ ~” 运算。单目运算符,对操作数进行逐位取反运算,若二进制位为 0 ,则取反后为 1 ;二进制位为 1 ,则取反后为 0 。 按位逻辑与“&” 运算。对两个操作数逐位进行运算,若对应位都为 1 ,则该位结果为 1 ,否则为 0 。 按位逻辑或“ |” 运算。对两个操作数逐位进行运算,若对应位都为 0 ,则该位结果为 0 ,否则为 1 。 按位逻辑异或“ ^” 运算。对两个操作数逐位进行运算,若对应位不相同,则该位结果为 1 ,否则为 0 。

Page 33: 第 2 章  数据类型、运算符与表达式

33 前一页 休息

2.2.1 基本运算符例如:

0xc3 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1

0x6e 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0

a 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0

short int a=0xc3 & 0x6e // 结果为 0x42

short int c=0x5a ^ 0x26 // 结果为 0x7c

0x5a 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0

0x26 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0

c 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0

Page 34: 第 2 章  数据类型、运算符与表达式

34 前一页 休息

2.2.1 基本运算符( 2 )移位运算符 移位运算符是双目运算符,使用的格式为:

operation1<<n 或 operation2>>m其中, n 和 m 为整数。 “<<” 运算符是将操作数 operation1 向左移动 n 个二进制位。

例如:short int operation1=0x8, n=3; short int a=operation1<<n;

注意:操作数左移 n 个二进制位后,右边移出的空位用 0 补齐。

结果为 0x40

0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 00 0 0

Page 35: 第 2 章  数据类型、运算符与表达式

35 前一页 休息

2.2.1 基本运算符 “>>” 运算符是将操作数 operation2 向右移动 m 个二进制位。

operation2 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1

b 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0

例如:short int operation2=0xa5, m=3;short int b=operation2>>m; // 结果为 0X14

- 操作数右移 m 个二进制位后,左边移出的空位用符号位补齐。- 移位运算符并不改变 operation1 和 operation2 本身的值。- 位运算符的运算优先级为:

~ 高于 << 、 >> 高于 & 高于 ^ 高于 | 。

Page 36: 第 2 章  数据类型、运算符与表达式

36 前一页 休息

2.2.1 基本运算符例 2-4 阅读下列程序,给出运行结果。#include <iostream.h>void main(void){ short int hexx=0x1a, hexy=0x36; short int hexa, hexb, hexc, hexd; short int hexl, hexr; hexa=~hexx; hexb=hexx & hexy; hexc=hexx | hexy; hexd=hexx ^ hexy; hexl=hexx<<3; hexr=hexy>>3; cout<<"hexx="<<hex<<hexx<<"\t hexy="<<hex<<hexy<<’\t’; cout<<"hexa="<<hex<<hexa<<"\n hexb="<<hex<<hexb<<’\t’; cout<<"hexc="<<hex<<hexc<<"\t hexd="<<hex<<hexd<<endl; }

程序运行后,输出: hexx=1a hexy=36 hexa=ffe5 hexb=12 hexc=3e hexd=2c

按位逻辑异或

Page 37: 第 2 章  数据类型、运算符与表达式

37 前一页 休息

2.2.1 基本运算符 逗号运算符 表达式 1 ,表达式 2 ,表达式 3 ,…,表达式 n 顺序计算各表达式的值,运算结果为最后一个表达式的值。逗号运算符的优先级最低。例如:

int a, b, c; a=(3+4, 5*6, 2+1); b=3+6, b*3, b+6

sizeof 运算符 sizeof( 类型 ) 或 sizeof( 表达式 )用于测试数据类型或表达式类型在内存中所占的字节数。例如: sizeof (int) // 整数类型四个字节,结果为 4 sizeof (3+3.6) // 3+3.6 的结果为 double 类型,结果为 8

a=3 b=9 第二个表达式的值是 15

Page 38: 第 2 章  数据类型、运算符与表达式

38 前一页 休息

2.2.2 表达式 由运算符和操作数组成的符合语法规则的序列称为表达式,表达式经运算后得到一个结果值。操作数可以是常量、变量等。

按运算符的不同可将表达式分为算术表达式、赋值表达式、关系表达式、逻辑表达式和逗号表达式。 按表达式能放在赋值号的左边还是右边可将表达式分为左值表达式和右值表达式。 表达式按照一定的运算顺序来求值,其运算顺序由表达式中运算符的优先级决定。 每个表达式都有确定的运算结果(表达式的值)和数据类型(值的类型)。

Page 39: 第 2 章  数据类型、运算符与表达式

39 前一页 休息

2.2.2 表达式 左值表达式和右值表达式

在 C++ 中,把能放在赋值号左边的表达式称为左值表达式,简称左值 (lvalue) ,左值表达式指定了一个存放数据的空间;把能放在赋值号右边的表达式称为右值表达式,简称右值 (rvalue) 。例如: int bottom , midx ;bottom ;bottom+3 ;5 ;int const top=19; //说明 const 变量 toptop ;midx=bottom ; 左值表达式可以作为右值表达式,但右值表达式不一定能作为左值表达式。

右值表达式

top 不能修改,是右值表达式

5 是常量,是右值表达式

Page 40: 第 2 章  数据类型、运算符与表达式

40 前一页 休息

2.2.2 表达式 由算术运算符、位操作运算符和操作数组成的符合语法规则的序列称为算术表达式,算术表达式的值为整型或实型。 除法运算符“ /”的两个操作数都是整数时,运算结果为一个整数,否则为一个浮点数。模运算符“%”要求两个操作数必须是整数,结果为余数。 表达式求值时,表达式中的每一个变量都必须有一个确定值。复杂的表达式中可增加括号,明确地规定表达式的求值顺序。

赋值表达式

算术表达式

由赋值运算符和操作数组成的符合语法规则的序列称为赋值表达式。赋值表达式要求赋值运算符“ =”左边必须是左值,其功能是用右值修改左值。 赋值表达式的计算顺序是从右向左进行的,运算结果是左值。

#include <iostream.h>void main(void){

int a=0;float b;

b=a=2.5;cout << a <<endl;cout << b <<endl;

}

Page 41: 第 2 章  数据类型、运算符与表达式

41 前一页 休息

2.2.2 表达式注意:

( 1 )赋值表达式是左值。例如:(x=5)=23+6 // x=5 是左值, x 和整个表达式的值为 2

9 x=y=z=0 // 先使 z=0 ,然后再将 z 的值赋给 y( 2 )说明语句中的 “ =” 为初始化符号,与赋值运算符含义不同。 float radius=5.63f; // 说明变量 radius ,并初始化为 5. 63 int sum1=total1=0; // 语法错误 radius=5.63f; // 给变量 radius 赋值( 3 )赋值表达式的值类型为左值的类型。例如: int mnt; mnt=2.9+6 // 先计算 2.9+6 的值 8.9 ,将整数 8 赋给左值 mnt ,表达式的值为 8

Page 42: 第 2 章  数据类型、运算符与表达式

42 前一页 休息

2.2.2 表达式 由关系运算符和操作数组成的符合语法规则的序列称为关系表达式。关系表达式的结果为逻辑值,即表达式中的关系成立时,其值为逻辑真(用 1 表示),否则其值为逻辑假(用 0 表示)。 关系表达式通常用来构造简单的条件表达式,用在程序流程控制语句中。例如: if (x>0) y = x;

else y = - x; 关系运算符“ ==” 用来比较两个操作数是否相等。若两个操作数相等,结果为 1 ;否则结果为 0 。“ =” 和“ ==” 是两个完全不同含义的运算符,注意不要误写。例如 :

( 1 ) if (x==168) … ( 2 ) if (x=168) … 单从语法上看,上面两个程序段都没有语法错误。因此,一旦将“ ==”误写成“ =” ,编译器不会指出语法错误。

判断 x是否等于 168,条件可能成,也可能不成立将值 168 赋给 x,条件永远成立

关系表达式

Page 43: 第 2 章  数据类型、运算符与表达式

43 前一页 休息

2.2.2 表达式 由逻辑运算符和操作数组成的符合语法规则的序列称为逻辑表达式。逻辑表达式的运算结果为逻辑值,一般用来构造比较复杂的条件表达式。例如:

age<=28 && pay<600 || age>28 && pay<800

在逻辑与和逻辑或运算符运算期间,一旦能确定表达式的值时,则结束计算。即: ( 1 )在计算 <operation1> && <operation2> 时,首先计算操作数 operation1 的值,若其值为逻辑真 ( 非 0) ,则计算 operation2 的值,并将 operation2 的逻辑值作为整个表达式的值;若 operation1 的值为逻辑假 ( 值为 0) ,则不计算 operation2 的值,结束整个表达式的计算,结果为 0 。例如:

width<=12 && (height+=8)

逻辑表达式

Page 44: 第 2 章  数据类型、运算符与表达式

44 前一页 休息

2.2.2 表达式( 2 )在计算 <operation1> || <operation2> 时,首先计算操作数 operation1 的值,若其值为逻辑假 ( 值为 0) ,则计算 operation2 的值,并将 operation2 的逻辑值作为整个表达式的值;若 operation1 的值为逻辑真 ( 非 0) ,则不计算 operation2 的值,结束整个表达式的计算,结果为 1 。例 2-6 阅读下列程序,给出运行结果。#include <iostream.h>void main(void){ int x=20, y=10, z=30, p, q; p=!x&&y<20; q=x<10||y++>20; cout<<"p="<<p<<’\t’; cout<<"q="<<q<<endl;}程序运行后,输出结果为: p=0 q=0

Page 45: 第 2 章  数据类型、运算符与表达式

45 前一页 休息

2.2.2 表达式 由逗号运算符和操作数组成的符合语法规则的序列称为逗号表达式。语法格式为:

<e1>, <e2>, <e3>, … , <en>逗号表达式也称顺序求值表达式,按从左向右的顺序逐个求出表达式 e1, e2, e3, … , en 的值,并将 en 的值作为整个逗号表达式的值, en 的数据类型作为整个逗号表达式的类型。例如:

int p, w, x=8, y=10, z=12;w=(x++, y, z+3)-5; p=x+5, y+x, z;

当逗号运算符的右操作数是一个左值时,则该逗号运算的结果也为左值。例如:(p=x+5, y+x, z)=2

逗号运算符的运算优先级最低。

w 的值为 (z+3)-5 =10p = x+5 = 14

z 的值 12 作为整个逗号表达式的值

逗号表达式

Page 46: 第 2 章  数据类型、运算符与表达式

46 前一页 休息

2.2.3 混合运算和赋值时的类型转换 自动转换

整型、实型、字符型数据间可以混合运算。在运算时,不同类型的数据要先转换成同一类型的数据再进行运算。 这种自动转换的功能也称为隐式转换。 转换规则是将低精度类型的数据转换为高精度类型的数据,因此在数据转换过程中,数据的精度不会损失。

当参与运算的两个操作数类型不可直接相互转换时,两者均向更高精度的类型转换。 由于字符是作为一个整数 ( 其 ASCII编码值 ) 来存放的,故字符也可以作为一个整数参与数值运算。

例如: 10+'a'+1.5-87.65*'b'

Page 47: 第 2 章  数据类型、运算符与表达式

47 前一页 休息

2.2.3 混合运算和赋值时的类型转换char short int long

float double long double

unsigned char unsigned

short unsigned int unsigned

long

图 2-2  不同数据类型的自动转换规则

Page 48: 第 2 章  数据类型、运算符与表达式

48 前一页 休息

2.2.3 混合运算和赋值时的类型转换 C++ 中允许将某种类型的数据强制性地转换为另一种指定的数据类型,语法格式为:

(< 数据类型 >) < 表达式 > ; 或者 < 数据类型 > (< 表达式 >) ;其功能是将表达式的值强制转换为指定的数据类型,强制转换也称为显式转换。例如:

int a=5, b=2;double d;

d=a/b; // d = 2.0 d=(double)a/b; // d = 2.5

d=float(a/b)*2; // d = 4.0

强制转换

Page 49: 第 2 章  数据类型、运算符与表达式

49 前一页 休息

2.2.3 混合运算和赋值时的类型转换( 1 )强制转换是一种不安全的转换。将高精度类型的数据转换为低精度类型的数据时,数据精度会降低。( 2 )强制类型运算后原变量的类型和值不变,但得到一个所需类型的中间变量。 在计算表达式时,对于系统能够自动转换的数据类型 ,�没有必要进行强制类型转换。仅在系统不作强制类型转换会影响表达式求值的精度或不能完成相应的运算时,才要使用强制类型转换。

Page 50: 第 2 章  数据类型、运算符与表达式

50 前一页 休息

2.2.3 混合运算和赋值时的类型转换 赋值时的类型转换

若 " = " 两边变量类型不同,在赋值时要进行类型转换。转换原则:根据左边变量的类型转换。1) 将实型数赋给整型变量时,去掉小数部分,仅取其整数部分赋给整型变量。2) 将整型数赋给实型变量时,将整数变换成实型数后 , 再赋给实型变量。3) 字符型数据赋给整型变量,分两种情况:

无符号型的字符变量,低八位不变,高位补0后赋值; 有符号型的字符变量 , � 若符号位为 0,与无符号型的转换规则相同;若符号位为 1,�将高位全部置 1 后再赋值。

4) 将实型数赋给整型、无符号 (长 )整型赋给整型变量 (即高精度赋给低精度 )时,若超出取值范围,赋值的结果错误。

Page 51: 第 2 章  数据类型、运算符与表达式

51 前一页 休息

2.2.4 副作用 赋值类型转换的副作用

类型转换可能会产生一些预想不到的结果。例如:int i, j;float x;x = (i=4.8)+(j=5.9)

计算逻辑表达式的过程中,一旦能确定逻辑表达式的值,就不必再逐步求值,从而使得一些预期的计算没有执行。

逻辑表达式优化时的副作用

Page 52: 第 2 章  数据类型、运算符与表达式

52 前一页 休息

2.3 表达式语句和空语句 将 C++ 的合法字符序列按照一定的语法规则排列起来就构成了语句。语句决定了执行什么样的操作以及执行操作的顺序。一般情况下语句自上向下顺序执行。

表达式语句和空语句 表达式语句

任何一个表达式后加上分号“ ;”就构成了表达式语句。例如:3*8-9;

空语句 空语句仅由一个分号组成,不进行任何操作。一般用于语法上要求有一条语句但实际上不需要执行任何操作的场合。例如: for (i=1; i<10; i++) ;

Page 53: 第 2 章  数据类型、运算符与表达式

53 前一页 休息

2.3 表达式语句和空语句

自增“ ++” 、自减“ --” 运算符都是单目运算符。“ ++” 和“ --” 是一个整体,中间不能用空格隔开。 ++ 是使操作数按其类型增加 1 个单位, -- 是使操作数按其类型减少 1 个单位。 自增 ( 自减 ) 运算符既可以放在操作数的左边,称为前缀增量 (减量 ) 运算符,也可以放在操作数的右边,称为后缀增量 (减量 ) 运算符。例如: ++i , --i , i++ , i-- 。

自增、自减运算符 程序设计中,有两种最常用的计算: i = i+1 和 i = i-1 ,这两种计算也可以简写为: i+=1 和 i-=1 , C 语言中,还提供了两种更简洁的运算符表示这样的运算,即:自增运算苻“ ++” 和自减运算符“ --” 。

Page 54: 第 2 章  数据类型、运算符与表达式

54 前一页 休息

2.3 表达式语句和空语句

当自增、自减运算单独作为一个表达式语句出现时,前缀运算与后缀运算没有区别,只有当自增、自减运算与其它运算混合在一起时,两者之间的区别才能够体现出来。例如:

前缀增量 (减量 ) 运算符是先使操作数自增 ( 自减 ) 1 个单位,然后取其值参与运算;后缀增量 (减量 ) 运算符是先用操作数的值参与运算,然后再使操作数自增 ( 自减 ) 1 个单位。

int count=15, digit=15, number, amount;count++; ++digit; // count 和 digit 都为 16number = ++count; // count 和 number 都为 17amount = digit++; // amount 的值为 16 , digit 的值为 17

自增、自减运算符

Page 55: 第 2 章  数据类型、运算符与表达式

55 前一页 休息

2.3 表达式语句和空语句例 2-9 阅读下列程序,给出运行结果。#include <iostream.h>void main(void){ int count, result1, result2, result3, result4; count=9; result1=++count; //count 先加 1 值为 10 ,再将 10赋给 result1 result2=count++; // 先将 count 的值 10赋给 result2 ;然后 count再加 1 result3=--count; //count 先减 1 值为 10 ,再将 10赋给 result3 result4=count--; // 先将 count 的值 10赋给 result4 ;然后 count再减 1 cout<<"result1="<<result1<<" count="<<count<<endl; cout<<"result2="<<result2<<" count="<<count <<endl; cout<<"result3="<<result3<<" count="<<count <<endl; cout<<"result4="<<result4<<" count="<<count <<endl;}

程序运行后,在屏幕上输出:result1=10 count=9result2=10 count=9result3=10 count=9result4=10 count=9

Page 56: 第 2 章  数据类型、运算符与表达式

56 前一页 休息

2.3 表达式语句和空语句 自增、自减运算符的优先级是同级的,其结合性为右结合的。 自增、自减运算符要求操作数必须是左值。 前缀增量或减量表达式的值是一个左值;而后缀增量或减量表达式的值不是左值。例如:

int amt=63 , nut=96;++ ++amt;++ nut--;

相当于 ++(++amt),结果为 65。

相当于 ++(nut--) , nut— 不是左值,产生语法错误。

Page 57: 第 2 章  数据类型、运算符与表达式

57 前一页 休息

2.3 表达式语句和空语句 自增、自减运算符的操作数类型通常是整型,但也允许是其它的数据类型。例如:

int i=1; char c='a'; float f=1.5;i++, c++, f++;

使用自增、自减运算符时,要尽量避免容易引起误解的书写方式。例如: c = a+++b ,究竟是 c = (a++)+b 还是 c = a+(++b) ? 在输出语句中,要尽可能避免使用自增、自减运算符。例如:

int i=1, j=1, k;k=(j++) + (j++); cout << i++ <<'\t'<< i++ <<'\n';

k=2, j=3

输出: 2 1

Page 58: 第 2 章  数据类型、运算符与表达式

58 前一页 休息

2.3 表达式语句和空语句#include <iostream.h>void main(){

int a = 1;int b;b= (++a)+(++a)+(++a);cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a=1;b= (a++)+(a++)+(a++);cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;

}

Page 59: 第 2 章  数据类型、运算符与表达式

59 前一页 休息