版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第2章章 简单数据类型与表达式简单数据类型与表达式主要内容主要内容:2.1 2.1 简单的运算对象简单的运算对象常量、变量和函数常量、变量和函数2.2 2.2 运算符与表达式运算符与表达式2.3 2.3 各种数据类型的混合运算各种数据类型的混合运算2计算机的存储单元计算机的存储单元v任何内容在计算机中都是以任何内容在计算机中都是以2进制进制形式存储的,形式存储的,2进制的一位是计算机中最小的存储单元,称为进制的一位是计算机中最小的存储单元,称为比比特(特(bit)。v计算机为便于管理将每计算机为便于管理将每8个比特分为一组,称为个比特分为一组,称为字字节(节(Byte),字节是计算机进行数
2、据处理的基本,字节是计算机进行数据处理的基本单位。单位。0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 11个字节个字节又又1个字节个字节32.1 常量、变量和函数v数据数据是计算机处理的对象;是计算机处理的对象;v数据是以某种数据是以某种特定的形式特定的形式存在的;存在的;v不同的数据之间往往还存在某些联系。不同的数据之间往往还存在某些联系。学号学号姓名姓名性别性别出生年月出生年月班级班级学制学制类别类别成绩成绩200512031001谢曼曼谢曼曼女女1985年年6月月法学法学05-14本科本科81200512031002王明明王明明女女1986年年8月月法学法学05-14本科本
3、科82.5200512031003冯倩倩冯倩倩女女1985年年9月月法学法学05-14本科本科75.5200512031004张雪娜张雪娜女女1987年年2月月法学法学05-14本科本科92200512031005杨洋杨洋女女1985年年5月月法学法学05-14本科本科68.5200512031006杜金松杜金松女女1986年年6月月法学法学05-14本科本科704数据类型数据类型基本类型基本类型非基本类型非基本类型指针类型(指针类型(type *)整型整型字符型字符型浮点型浮点型布尔型布尔型 (bool)空类型空类型 (void)短整型短整型 (short int)整型整型 (int)长整型
4、长整型 (long int)单精度型单精度型 (float)双精度型双精度型 (double)长双精度型长双精度型 (long double)枚举类型(枚举类型(enum)数组类型(数组类型(type )结构体类型(结构体类型(struct)共用体类型(共用体类型(union)类类型(类类型(class)5几点说明几点说明v以上这些数据类型还可以构成更复杂的数据结构。以上这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。等复杂的数据结构。vC+并没有统一规定各类数据的精度、数值范围并没有统一规定各类数据
5、的精度、数值范围和在内存中所占的字节数,各和在内存中所占的字节数,各C+编译系统根据编译系统根据自己的情况作出安排。自己的情况作出安排。v整型和字符型数据还分别分为:有符号整型和无整型和字符型数据还分别分为:有符号整型和无符号整型,有符号字符型和无符号字符型。符号整型,有符号字符型和无符号字符型。672.1.1 常常 量量v常量的值是不能改变的,一般从其字面形式即可常量的值是不能改变的,一般从其字面形式即可判别是否为常量。判别是否为常量。v如:他的名字叫如:他的名字叫张三张三,年龄是,年龄是22岁,身高是岁,身高是176cm。v常量包括两大类,即常量包括两大类,即数值型常量数值型常量(即常数即
6、常数)和和字符字符型常量型常量。v这种从字面形式即可识别的常量称为这种从字面形式即可识别的常量称为“字面常量字面常量”或或“直接常量直接常量”。8数值常量数值常量v数值型常量就是通常所说的常数;数值型常量就是通常所说的常数;v数值型常量分为:数值型常量分为:整型常量整型常量和和实型常量实型常量(又称(又称浮浮点型常量)点型常量)。9整型常量整型常量(1) 其值在其值在-32768+32767(即:(即:-216216-1)范围)范围内,认为它是内,认为它是short int型。型。(2) 其值在其值在-2147483648+2147483647 (即:(即:-232232-1)范围内,则认为它
7、是)范围内,则认为它是long int型。型。(3) 常量无常量无unsigned型。型。注意注意:本课件中均以:本课件中均以32位操作系统和位操作系统和Visual C+ 6.0编译环境为例说明。编译环境为例说明。10整型常量的表示整型常量的表示v一个整型常量可以用一个整型常量可以用3种不同的方式表示:种不同的方式表示: 1)十进制(默认方式)十进制(默认方式)43,1345,87654 2)八进制)八进制 以以0开头开头 043, 056, 011 3)十六进制)十六进制 以以0 x开头开头 0 x12 ,0 xa3 ,0 x34 , 0 xdf11实型常量(实数或浮点数)实型常量(实数或
8、浮点数)v一个实型常量可以用两种不同的方式表示:一个实型常量可以用两种不同的方式表示: (1) 十进制小数形式十进制小数形式。 它一般由整数部分和小数部分组成,可以省略其它一般由整数部分和小数部分组成,可以省略其中之一中之一(如:如:78.或或.06,.0),但不能二者皆省略。,但不能二者皆省略。C+编译系统中一律按编译系统中一律按双精度常量双精度常量处理,在内存处理,在内存中占中占8个字节。个字节。 (2) 指数形式指数形式(即浮点形式即浮点形式) 其一般形式为:其一般形式为: 数符数符 数字部分数字部分 指数部分指数部分 如如3.14159可以表示为可以表示为0.314159101,3.1
9、4159100,31.415910-1,314.15910-2等形式。在程序中应表示为:等形式。在程序中应表示为: 0.314159e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母用字母e表示其后的数是以表示其后的数是以10为底的幂,如为底的幂,如e12表示表示1012。12浮点数的存放浮点数的存放v在程序中不论把浮点数写成小数形式还是指数形在程序中不论把浮点数写成小数形式还是指数形式,式,在内存中都是以指数形式在内存中都是以指数形式(即浮点形式即浮点形式)存储存储的的。例如不论在程序中写成。例如不论在程序中写成314.159或或314.159e0,31.4159
10、e1,3.14159e2, 0.314159e3等形式,在等形式,在内存中都是以规范化的指数形式存放,如图内存中都是以规范化的指数形式存放,如图2.3所所示。示。13浮点数的存放浮点数的存放v数字部分必须小于数字部分必须小于1;v小数点后面第一个数字必须是一个非小数点后面第一个数字必须是一个非0数字;数字;v存储单元分为两部分,一部分用来存放数字部分,存储单元分为两部分,一部分用来存放数字部分,一部分用来存放指数部分;一部分用来存放指数部分;v为便于理解,在图为便于理解,在图2.3中是用十进制表示的,实际中是用十进制表示的,实际上在存储单元中是用二进制数来表示小数部分,上在存储单元中是用二进制
11、数来表示小数部分,用用2的幂次来表示指数部分的。对于以指数形式表的幂次来表示指数部分的。对于以指数形式表示的数值常量,也都作为双精度常量处理。示的数值常量,也都作为双精度常量处理。14字符常量字符常量1. 普通的字符常量普通的字符常量 用单撇号括起来的一个字符就是字符型常量。用单撇号括起来的一个字符就是字符型常量。如如a,#,%,D都是合法的字符常量,在内存中占都是合法的字符常量,在内存中占一个字节。一个字节。v注意:注意: 字符常量只能包括一个字符,如字符常量只能包括一个字符,如AB 是不合法是不合法的。的。 字符常量区分大小写字母,如字符常量区分大小写字母,如A和和a是两个不是两个不同的字
12、符常量。同的字符常量。 撇号撇号()是定界符,而不属于字符常量的一部分。是定界符,而不属于字符常量的一部分。如如couta;输出的是一个字母;输出的是一个字母“a”,而不是,而不是3个字符个字符“a ”。15转义字符常量转义字符常量vC+还允许用一种特殊形式的字符常量,就是以还允许用一种特殊形式的字符常量,就是以 “”开头的字符序列开头的字符序列“转义字符转义字符”,意思是将,意思是将反斜杠(反斜杠()后面的字符转换成另外的意义。)后面的字符转换成另外的意义。v在程序中也无法用一个一般形式的字符表示,只在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。能采用特殊形式来表示。v注意
13、注意: 转义字符虽然包含转义字符虽然包含2个或多个字符,但它只个或多个字符,但它只代表一个字符。编译系统在见到字符代表一个字符。编译系统在见到字符“”时,会时,会接着找它后面的字符,把它处理成一个字符,在接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节。内存中只占一个字节。16转义字符转义字符 含含 义义 ASCII代码代码a响铃响铃7换行,光标位置移到下一行开头换行,光标位置移到下一行开头10水平制表(跳到下一个水平制表(跳到下一个tab位置)位置)9退格,将当前位置移到前一列退格,将当前位置移到前一列8回车,将当前位置移到本行开头回车,将当前位置移到本行开头13换页,将当前位置
14、移到下页开头换页,将当前位置移到下页开头12 v竖向跳格竖向跳格8 反斜杠字符反斜杠字符“”92单引号(撇号)字符单引号(撇号)字符39双引号字符双引号字符340空字符空字符0ddd1到到3位位8进制数所代表的字符进制数所代表的字符 xhh1到到2位位16进制数所代表的字符进制数所代表的字符 17例例2.1#include using namespace std;int main( )char ch1,ch2;ch1=101;ch2=x61;coutch1tch2n;return 0;18字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法v将一个字符常量存放到内存单元
15、时,实际上并不将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字是把该字符本身放到内存单元中去,而是将该字符相应的符相应的ASCII代码放到存储单元中。代码放到存储单元中。v如果字符变量如果字符变量c1的值为的值为a,c2的值为的值为b,则在变量,则在变量中存放的是中存放的是a的的ASCII码码97,b 的的ASCII码码98,如图如图2.419思考题?思考题?v 字符型的常量能否和整型常量进行加减乘除等算术运算?字符型的常量能否和整型常量进行加减乘除等算术运算?v 如:如:a+16=?v 例例2.2 字符数据与整数进行算术运算。下面程序的作用是将小写字母转换
16、为大字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。写字母。#include using namespace std;int main( ) char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;coutc1 c2endl;return 0;20v用双撇号括起来的部分就是字符串常量,如用双撇号括起来的部分就是字符串常量,如abc,Hello!,a+b,字符串常量字符串常量abc在内存中占在内存中占4个字节个字节(而不是而不是3个字节个字节),见下图。,见下图。v注意:注意: a和和a代表不同的含义,代表不同的含义,a是字符串是字符串常量,常量,a
17、是字符常量。是字符常量。v思考:思考: abcn包含几个字符?包含几个字符?字符串常量字符串常量21符号常量符号常量v 在在C+程序设计中,常用一个符号名代表一个常量,称为程序设计中,常用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。符号常量,即以标识符形式出现的常量。v 例例2.3 符号常量的使用。符号常量的使用。 #include using namespace std;#define PRICE 30 /注意这不是语句,末尾不要加分号注意这不是语句,末尾不要加分号int main ( ) int num,total; num=10; total=num * PRICE;
18、 couttotal=totalendl; return 0; v 程序运行结果为:程序运行结果为:total=30022使用符号常量的好处使用符号常量的好处使用符号常量的好处是:使用符号常量的好处是:(1) 含义清楚。含义清楚。(2) 在需要改变一个常量时能做到在需要改变一个常量时能做到“一改全改一改全改”。 如如 #define PRICE 35232.1.2 变量变量v什么是变量什么是变量 在程序运行期间其值可以改变的量称为变量。在程序运行期间其值可以改变的量称为变量。一个变量应该有一个名字,并在内存中占据一定一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的
19、值。请的存储单元,在该存储单元中存放变量的值。请注意区分注意区分变量名变量名和和变量值变量值这两个不同的概念,见这两个不同的概念,见图图2.6。24变量名规则变量名规则v标识符标识符是用来标识变量、符号常量、函数、数组、是用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列。类型等实体名字的有效字符序列。v标识符就是一个名字。标识符就是一个名字。v变量名是标识符的一种,变量的名字必须遵循标变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。识符的命名规则。vC+规定标识符只能由规定标识符只能由字母、数字和下划线字母、数字和下划线3种字种字符组成,且符组成,且第一个字符必须为字
20、母或下划线第一个字符必须为字母或下划线。 sum, average, $123, total, Student_name, Zhang-ling, tan, BASIC, li_ling M.D.John, #33, 3G64, Ling li, C+, Zhang-ling, U.S.A.25定义变量定义变量v定义变量的一般形式是:定义变量的一般形式是:变量类型变量类型 变量名变量名1,变量名,变量名2, ,变量名变量名n;如:如:float a,b,c,d,e; v定义定义a,b,c,d,e为单精度型变量,注意各变量间以为单精度型变量,注意各变量间以逗号逗号分隔,最后是分隔,最后是分号。分
21、号。v可以在定义变量时指定它的初值。如:可以在定义变量时指定它的初值。如: float a=83.5,b,c=64.5,d=81.2,e;注意:注意: C+只要求在第一次使用该变量之前进行定义即只要求在第一次使用该变量之前进行定义即可。也就是说,它可以出现在语句的中间。可。也就是说,它可以出现在语句的中间。26C+要求对变量作强制定义的目的要求对变量作强制定义的目的(1)凡未被事先定义的,不作为变量名,这就能保证凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。程序中变量名使用得正确。(2) 在编译时就能为其分配相应的存储单元。在编译时就能为其分配相应的存储单元。 (3) 便于
22、在编译时检查该变量所进行的运算是否合法。便于在编译时检查该变量所进行的运算是否合法。27变量的初始化变量的初始化l 允许在定义变量时对它赋予一个初值,这称为允许在定义变量时对它赋予一个初值,这称为变变量初始化量初始化。初值可以是常量,也可以是一个有确。初值可以是常量,也可以是一个有确定值的表达式。定值的表达式。如:如:float a,b=5.78*3.5,c=2*sin(2.0);l 如果对变量未赋初值,则该变量的初值是一个不如果对变量未赋初值,则该变量的初值是一个不可预测的值,即该存储单元中当时的内容是不知可预测的值,即该存储单元中当时的内容是不知道的。道的。l 初始化不是在编译阶段完成的,
23、而是在程序运行初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋时执行本函数时赋予初值的,相当于执行一个赋值语句。值语句。28v 例如,例如, int a=3; 相当于以下两个语句相当于以下两个语句 : int a; / 指定为整型变量指定为整型变量 a=3; / 赋值语句,将赋给赋值语句,将赋给 l 对多个变量赋予同一初值,必须分别指定,不能写成对多个变量赋予同一初值,必须分别指定,不能写成 float a=b=c=4.5; 错误错误 而应写成而应写成 float a=4.5,b=4.5,c=4.5; 正确正确 或或 float a,b,c=4.5;正确正确
24、 a=b=c;29思考题思考题l 定义了一个变量,但没有对其初始化,该变量有定义了一个变量,但没有对其初始化,该变量有没有值?没有值?例:例: #include using namespace std; int main() int a,b,c;couta=a b=b c=cendl;return 0; 30常变量常变量l 在定义变量时,如果加上关键字在定义变量时,如果加上关键字const,则变量的值在程序运,则变量的值在程序运行期间不能改变,这种变量称为常变量行期间不能改变,这种变量称为常变量(constant variable)。 例如,例如, const int a=3; /用用cons
25、t来声明这种变量的值不能改变,指定其值始终为来声明这种变量的值不能改变,指定其值始终为3。l 在定义常变量时在定义常变量时必须必须同时对它初始化同时对它初始化(即指定其值即指定其值),此后它的,此后它的值不能再改变。常变量不能出现在赋值号的左边。例如上面一值不能再改变。常变量不能出现在赋值号的左边。例如上面一行不能写成:行不能写成: const int a; a=3; /常变量不能被赋值常变量不能被赋值l 可以用表达式对常变量初始化,如:可以用表达式对常变量初始化,如: const int b=3+6,c=3*cos(1.5); /b的值被指定为的值被指定为9,c的值被的值被指定为指定为3*c
26、os(1.5)312.1.3 标准函数标准函数v C+提供了丰富的内部函数,又称标准函数,如:三角函数、指数函数、对提供了丰富的内部函数,又称标准函数,如:三角函数、指数函数、对数函数和平方根函数等,用户需要是可以按照规定的格式进行引用。数函数和平方根函数等,用户需要是可以按照规定的格式进行引用。v 用户在使用标准函数前,必须把该函数所在的标准函数库文件包含到自己的用户在使用标准函数前,必须把该函数所在的标准函数库文件包含到自己的程序中来,如使用数学函数库:程序中来,如使用数学函数库: #include 。例如:例如: #include #include using namespace std
27、; int main( ) int a=36;couta=a a的平方根为:的平方根为:sqrt(a)endl;return 0; 322.2 C+的运算符与表达式的运算符与表达式(1) 算术运算符算术运算符 +(加、或正值加、或正值)-(减、或负值减、或负值) *(乘乘) /(除除) %(整除求余整除求余)+(自自加加) -(自减自减)(2) 关系运算符关系运算符 (大于大于)(小于小于) (等于等于)(大于或等于大于或等于)(小于或小于或等于等于)!(不等于不等于)() 逻辑运算符逻辑运算符 (逻辑与逻辑与) |(逻辑或逻辑或) !(逻辑非逻辑非)() 位运算符位运算符 (按位右移按位右移
28、) (按位与按位与) |(按位或按位或) (按按位异或位异或) (按位取反按位取反)() 赋值运算符赋值运算符 (及其扩展赋值运算符及其扩展赋值运算符)() 条件运算符条件运算符 (? :)33() 逗号运算符逗号运算符 (,)() 指针运算符指针运算符 (*)( 9 ) 引用运算符和地址运算符引用运算符和地址运算符 ()(10) 求字节数运算符()求字节数运算符()(11) 强制类型转换运算符(强制类型转换运算符( (类型类型) 或类型或类型( ))(12) 成员运算符成员运算符 (.)(13) 指向成员的运算符指向成员的运算符 (-)(14) 下标运算符下标运算符 ( )(15) 其他其他
29、 (如函数调用运算符()(如函数调用运算符()34v基本的算术运算符基本的算术运算符 (加法运算符,或正值运算符。如(加法运算符,或正值运算符。如3+5,+3) (减法运算符,或负值运算符。如(减法运算符,或负值运算符。如5-2,-3) * (乘法运算符。如(乘法运算符。如3*5) (除法运算符。如(除法运算符。如5/3) (模运算符,或称求余运算符,两侧均应为(模运算符,或称求余运算符,两侧均应为整型整型数据,如的值为)。数据,如的值为)。2.2.1 算术运算符与算术表达式算术运算符与算术表达式35说明:说明:(1)两个整数相除的结果为整数,如两个整数相除的结果为整数,如5/3的结果值为的结
30、果值为1,舍去小,舍去小数部分。数部分。(2)如果除数或被除数中有一个为负值,则舍入的方向是不如果除数或被除数中有一个为负值,则舍入的方向是不固定的。固定的。 例如,例如,-5/3在有的在有的C+系统上得到结果系统上得到结果-1,有的,有的C+系统系统则给出结果则给出结果-2。多数编译系统采取。多数编译系统采取“向零取整向零取整”的方法,即的方法,即5/3的值等于的值等于1,-5/3的值等于的值等于-1,取整后,取整后向零靠拢向零靠拢。 ( 3)如果参加如果参加+, -, *, / 运算的两个数中有一个数为运算的两个数中有一个数为float型数据,型数据,则运算的结果是则运算的结果是doubl
31、e型。型。36例例2.5#includeusing namespace std;int main( )int a=3,b=5,c=0;c=b/a;couta=a b=b b/a=cendl;return 0;37l 用算术运算符和括号将运算对象(也称操作数)连接起来的、用算术运算符和括号将运算对象(也称操作数)连接起来的、符合符合C+语法规则的式子,称语法规则的式子,称C+算术表达式。算术表达式。l 运算对象包括常量、变量、函数等。例如,下面是一个合法运算对象包括常量、变量、函数等。例如,下面是一个合法的的C+算术表达式:算术表达式: a*b/c-1.5+al C+语言规定了运算符的优先级和结
32、合性。在求解表达式时,语言规定了运算符的优先级和结合性。在求解表达式时,先按先按运算符的优先级别高低次序运算符的优先级别高低次序执行。执行。l 优先级一样时,算术运算符的结合方向为优先级一样时,算术运算符的结合方向为“自左至右自左至右”,即,即先左后右,先左后右, “自左至右的结合方向自左至右的结合方向”又称又称“左结合性左结合性”,即运算对象先与左面的运算符结合。即运算对象先与左面的运算符结合。算术表达式和运算符的优先级与结合性算术表达式和运算符的优先级与结合性38v在在C和和C+中,常在表达式中使用自增中,常在表达式中使用自增(+)和自减和自减(-)运算符,他们的作用是使变量的值增运算符,
33、他们的作用是使变量的值增1或减或减1,如,如 +i(如(如i的原值为的原值为3,则执行,则执行j=+i后,后,j的值为的值为4) -i (如如i的原值为的原值为3,则执行,则执行j=-i后,后,j的值为的值为2) i+ (如如i的原值为的原值为3,则执行,则执行j=i+后,后,j的值为的值为3,然,然后后i变为变为4) i-(如如i的原值为的原值为3,则执行,则执行j=i-后,后,j的值为的值为3,然后,然后i变为变为2)自增和自减运算符自增和自减运算符39注意:注意: (1) 自增运算符自增运算符(+)和自减运算符和自减运算符(-)只能用于只能用于变量变量,而不能用于常,而不能用于常量或表达
34、式。量或表达式。 (2) +和和-的结合方向是的结合方向是“自右至左自右至左”, (3) 自增运算符(自增运算符(+)和自减运算符()和自减运算符(-)使用十分灵活,但在很)使用十分灵活,但在很多情况下可能出现歧义性,产生多情况下可能出现歧义性,产生“意想不到意想不到”的副作用。的副作用。 int i=3; cout i+“ ”i+; (i+)+(i+)+(i+) 3 3 3 执行三次执行三次i最后最后i=6 (4) 自增(减)运算符在自增(减)运算符在C+程序中是经常见到的,常用于循环语程序中是经常见到的,常用于循环语句中,使循环变量自动加句中,使循环变量自动加1。也用于指针变量,使指针指向
35、下一个。也用于指针变量,使指针指向下一个地址。地址。40例例2.6#includeusing namespace std;int main()int a=3,b=5,c=0;c=(a+)+(a+)+(a+);couta=a (a+)+(a+)+(a+)=cendl;return 0;41v 赋值运算符赋值运算符 赋值符号赋值符号“=”就是赋值运算符,它的作用是将一个数据就是赋值运算符,它的作用是将一个数据赋给一个变量。如赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称的作用是执行一次赋值操作(或称赋值运算)。把常量赋值运算)。把常量3赋给变量赋给变量a。也可以将一个表达式的值。也可以将
36、一个表达式的值赋给一个变量。赋给一个变量。v 赋值过程中的类型转换赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换。符型时,在赋值时会自动进行类型转换。(1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。其小数部分。(2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。存储到变量中。2.2.2 赋值运算符与赋值表达式赋值运算符与赋值表达式42(3) 将一个将
37、一个double型数据赋给型数据赋给float变量时,要注意数值范围不能溢出。变量时,要注意数值范围不能溢出。(4) 字符型数据赋给整型变量,将字符的字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。码赋给整型变量。(5) 将一个将一个int、short或或long型数据赋给一个型数据赋给一个char型变量,只将其低型变量,只将其低8位原位原封不动地送到封不动地送到char型变量(发生型变量(发生截断截断)。例如)。例如short int i=289;char c;c=i; /将一个将一个int型数据赋给一个型数据赋给一个char型变量型变量v 赋值情况见图赋值情况见图2.8。为方便起
38、见,以一个。为方便起见,以一个int型数据占两个字节型数据占两个字节(16位位)的情的情况来说明。况来说明。图图2.843(6) 将将signed(有符号有符号)型数据赋给长度相同的型数据赋给长度相同的unsigned(无符号无符号)型变量,将型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。例例2.7 将有符号数据传送给无符号变量。将有符号数据传送给无符号变量。#include using namespace std;int main( ) unsigned short a;short int b=-1;a=b;co
39、uta=aendl;return 0;运行结果为:运行结果为:6553544v 赋给赋给b的值是的值是-1,怎么会得到,怎么会得到65535呢?请看图呢?请看图2.9所示的赋值情况。所示的赋值情况。图图2.9v -1的补码形式为的补码形式为1111111111111111(即全部即全部16个二进制位均为个二进制位均为1),将它传,将它传送给送给a,而,而a是无符号型变量,是无符号型变量,16个位全个位全1是十进制的是十进制的65535。如果。如果b为正为正值,且在值,且在032767之间,则赋值后数值不变。之间,则赋值后数值不变。注意:注意:不同类型的整型数据间的赋值归根结底就是一条:不同类型
40、的整型数据间的赋值归根结底就是一条:按存储单元中按存储单元中的存储形式直接传送的存储形式直接传送。45v 在赋值符在赋值符“”之前加上其他运算符,可以构成复合的运算之前加上其他运算符,可以构成复合的运算符。如果在符。如果在“”前加一个前加一个“”运算符就成了复合运算符运算符就成了复合运算符“”。例如,可以有。例如,可以有 a+=3 等价于等价于 a=a+3 x*=y+8 等价于等价于 x=x*(y+8) x%=3 等价于等价于 x=x%3v 以以“a+=3”为例来说明,它相当于使为例来说明,它相当于使a进行一次自加进行一次自加3的操作。的操作。即先使即先使a加加3,再赋给,再赋给a。同样,。同
41、样,“x*=y+8”的作用是使的作用是使x乘以乘以(y+8),再赋给),再赋给x。v 为便于记忆,可以这样理解:为便于记忆,可以这样理解:复合的赋值运算符复合的赋值运算符46 a+= b (其中其中a为变量,为变量,b为表达式为表达式) a+= b (将有下划线的将有下划线的“a+”移到移到“=”右侧右侧) a = a + b (在(在“=”左侧补上变量名左侧补上变量名a) 注意,如果注意,如果b是包含若干项的表达式,则相当于它有括号。如是包含若干项的表达式,则相当于它有括号。如 x %= y+3 x %= (y+3) x = x%(y+3)(不要错认为(不要错认为x=x%y+3)凡是二元(二
42、目)运算符,都可以与赋值符一起组合成复合赋凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。值符。C+可以使用以下几种复合赋值运算符:可以使用以下几种复合赋值运算符:,*,&,|其中后其中后5种是有关位运算的。种是有关位运算的。47 C+之所以采用这种复合运算符,之所以采用这种复合运算符,v 一是为了简化程序,使程序精炼,一是为了简化程序,使程序精炼,v 二是为了提高编译效率(这样写法与二是为了提高编译效率(这样写法与“逆波兰逆波兰”式一致,有利于编译,能产生质量较高的目标代式一致,有利于编译,能产生质量较高的目标代码)。码)。48v 由赋值运算符将一个变量和一个表达式连接起
43、来的式子称为由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式赋值表达式”。 它的一般形式为:它的一般形式为: 如:如:x=a+b; 注意:注意: 赋值运算符左侧的标识符称为赋值运算符左侧的标识符称为“左值左值”(left value,简,简写为写为lvalue)。变量可以作为左值,而。变量可以作为左值,而表达式表达式a+b就不能作为就不能作为左值,左值,常变量常变量也不能作为左值,因为常变量不能被赋值。也不能作为左值,因为常变量不能被赋值。 出现在赋值运算符右侧的表达式称为出现在赋值运算符右侧的表达式称为“右值右值”(right value,简写为,简写为rvalue)。显然左
44、值也可以出现在赋值运算符。显然左值也可以出现在赋值运算符右侧,因而左值都可以作为右值。右侧,因而左值都可以作为右值。赋值表达式赋值表达式49如:如:int a=3,b,c;b=a; / b是左值是左值c=b; / b也是右值也是右值赋值表达式中的赋值表达式中的“表达式表达式”,又可以是一个赋值表达式。,又可以是一个赋值表达式。如如: a=(b=5)下面是赋值表达式的例子:下面是赋值表达式的例子: a=b=c=5 (赋值表达式值为(赋值表达式值为5,a,b,c值均为值均为5) a=5+(c=6) (表达式值为(表达式值为11,a值为值为11,c值为值为6) a=(b=4)+(c=6) (表达式值
45、为(表达式值为10,a值为值为10,b等于等于4,c等于等于6) a=(b=10)/(c=2) (表达式值为(表达式值为5,a等于等于5,b等于等于10,c等于等于250请分析下面的赋值表达式:请分析下面的赋值表达式: (a=3*5)=4*3 ?a=3*5=4*3 ?l 赋值表达式也可以包含复合的赋值运算符。如赋值表达式也可以包含复合的赋值运算符。如a+=a-=a*a表达式的求解步骤如下:表达式的求解步骤如下: 先进行先进行“a-=a*a”的运算,它相当于的运算,它相当于a=a-a*a=12-144-132。 再进行再进行“a+=-132”的运算,它相当于的运算,它相当于a=a+(-132)-
46、132-132-264。l C+将赋值表达式作为表达式的一种,使赋值操作不仅可以将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。这是(如输出语句、循环语句等)中。这是C+语言灵活性的一语言灵活性的一种表现。种表现。 注意:注意:用用cout语句输出一个赋值表达式的值时,要将该赋值语句输出一个赋值表达式的值时,要将该赋值表达式用括号括起来,如果写成表达式用括号括起来,如果写成“couta=b;”将会出现编将会出现编译错误。译错误。51C+提供一种特殊的运算符提供一
47、种特殊的运算符逗号运算符。用它将两个表达逗号运算符。用它将两个表达式连接起来。如式连接起来。如 3+5,6+8 称为逗号表达式,又称为称为逗号表达式,又称为“顺序求值运算符顺序求值运算符”。l 逗号表达式的一般形式为逗号表达式的一般形式为 表达式,表达式表达式,表达式l 逗号表达式的求解过程是:先求解表达式逗号表达式的求解过程是:先求解表达式1,再求解表达式,再求解表达式2。整个逗号表达式的值是表达式整个逗号表达式的值是表达式2的值。的值。 如,逗号表达式如,逗号表达式 a=3*5,a*4l 逗号表达式的一般形式可以扩展为逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式,表达式,
48、表达式,表达式,表达式它的值为表达式的值。它的值为表达式的值。2.2.3 逗号运算符与逗号表达式逗号运算符与逗号表达式522.2.4 关系运算符与关系表达式关系运算符与关系表达式v 关系表达式:用关系运算符将两个表达式连接起来的式子关系表达式:用关系运算符将两个表达式连接起来的式子优先级相同优先级相同 (高高) (小于小于) (大于大于) = (大于或等于大于或等于) = (等于等于) != (不等于不等于)优先级相同优先级相同 (低低)1. 1. 前前4 4种关系运算符(种关系运算符( , , )的优先级别相同,)的优先级别相同,后两种也相同。前后两种也相同。前4 4种高于后两种。例如,种高
49、于后两种。例如,“”优先于优先于“”。而。而“”与与“”a+b 等效于等效于 c(a+b) ab=c 等效于等效于(ab)=c a=bc 等效于等效于a=(bc 等效于等效于a=(bc)54v关系表达式的值是一个逻辑值,即关系表达式的值是一个逻辑值,即“真真”或或“假假”。例如,关系表达式。例如,关系表达式“5=3”的值为的值为“假假”,“5=0”的值为的值为“真真”。v在在C和和C+中都用数值中都用数值1代表代表“真真”,用,用0代表代表“假假”。v如果有以下赋值表达式:如果有以下赋值表达式:d=ab 则则d得到的值为得到的值为1f=abc f得到的值为得到的值为055v C语言没有提供逻辑
50、型数据,关系表达式的值语言没有提供逻辑型数据,关系表达式的值(真或假真或假)分别用分别用数值数值1和和0代表。代表。v C+增加了逻辑型数据。逻辑型常量只有两个,即增加了逻辑型数据。逻辑型常量只有两个,即false(假假)和和true(真真)。v 逻辑型变量要用类型标识符逻辑型变量要用类型标识符bool来定义,它的值只能是来定义,它的值只能是true和和false之一。如:之一。如:bool found,flag=false; /定义逻辑变量定义逻辑变量found和和flag,并,并使使flag的初值为的初值为falsefound=true; /将逻辑常量将逻辑常量true赋给逻辑变量赋给逻辑
51、变量foundv 由于逻辑变量是用关键字由于逻辑变量是用关键字bool来定义的,因此又称为来定义的,因此又称为布尔变量布尔变量。逻辑型常量又称为逻辑型常量又称为布尔常量布尔常量。所谓逻辑型,就是。所谓逻辑型,就是布尔型布尔型。v 设立逻辑类型的目的是为了看程序时直观易懂。设立逻辑类型的目的是为了看程序时直观易懂。2.2.5 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式56v 在编译系统处理逻辑型数据时,将在编译系统处理逻辑型数据时,将false处理为处理为0,将,将true处理为处理为1。因此,逻辑型数据可以与数值型数据进行算术。因此,逻辑型数据可以与数值型数据进行算术运算。运算。v 如果将一
52、个非零的整数赋给逻辑型变量,则按如果将一个非零的整数赋给逻辑型变量,则按“真真”处理,处理,如如flag=123; /赋值后赋值后flag的值为的值为truecoutflag;v 输出为数值输出为数值1。57v 将两个关系表达式用逻辑运算符连接起来就成为一个将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式。逻辑表达式。v C+提供提供3种逻辑运算符:种逻辑运算符:(1) & 逻辑与逻辑与 (相当于其他语言中的相当于其他语言中的AND)(2) | 逻辑或逻辑或 (相当于其他语言中的相当于其他语言中的OR)(3) ! 逻辑非逻辑非 (相当于其他语言中的相当于其他语言中的NOT)v
53、逻辑运算举例如下:逻辑运算举例如下:a & b 若若a,b为真,则为真,则a & b为真。为真。a|b 若若a,b之一为真,则之一为真,则a|b为真。为真。!a 若若a为真,则为真,则!a为假。为假。58v逻辑表达式的值是一个逻辑量逻辑表达式的值是一个逻辑量“真真”或或“假假”。v在给出逻辑运算结果时,以数值在给出逻辑运算结果时,以数值1代表代表“真真”,以,以0代表代表“假假”。v但在判断一个逻辑量是否为但在判断一个逻辑量是否为“真真”时,采取的标时,采取的标准是:准是: 如果其值是如果其值是0就认为是就认为是“假假”,如果其值,如果其值是非是非0就认为是就认为是“真真”。5
54、92.2.6 条件运算符和条件表达式条件运算符和条件表达式v条件表达式的一般形式为条件表达式的一般形式为表达式表达式1 ? 表达式表达式2 表达式表达式3v优先级高于赋值运算符优先级高于赋值运算符,低于逻辑运算符低于逻辑运算符v用用if语句表示则为:语句表示则为:if (表达式表达式1 ) 表达式表达式2 ;else 表达式表达式3;eg. x? a b若若x=0,则条件表达式的值为字符,则条件表达式的值为字符b的的ASCII码。码。60例2.8#includeusing namespace std;int main()char ch;cinch;ch=(ch=A & ch=Z)?(c
55、h+32):ch;coutchendl;return 0;61 2.2.7 2.2.7 位运算位运算v位运算是一种对运算对象按二进制位进行操作的位运算是一种对运算对象按二进制位进行操作的运算,而且是作用于运算对象的每一个位上运算,而且是作用于运算对象的每一个位上( (而并而并不是只对其中的某一个位进行运算不是只对其中的某一个位进行运算) )。v位运算的运算对象只能是整型数据位运算的运算对象只能是整型数据( (包括字符型包括字符型), ), 且运算结果仍为整型数据。且运算结果仍为整型数据。62位运算符位运算符v C+C+提供如下提供如下6 6个位运算符:个位运算符: ( (单目单目, , 按位求
56、反按位求反) )、& &( (双目双目, , 按位与按位与) )、| |( (双目双目, , 按位或按位或) )、 ( (双目双目, , 按位异或按位异或) )、( (双目双目, , 按位右移按位右移) )。v 下面说明这下面说明这6 6个运算符的使用含义。个运算符的使用含义。unsigned char d1=38, d2=44; unsigned char d1=38, d2=44; v 设有无符号字符型变量设有无符号字符型变量d1, d1, 它具有初值它具有初值38, 38, 即二进制的即二进制的00100110; 00100110; 及无符号字符型变量及无符号字符型变量d
57、2, d2, 它具有初值它具有初值44, 44, 即二即二进制的进制的0010110000101100。 63v那么(那么(d1=38=00100110d1=38=00100110; d2=44=00101100d2=44=00101100):): vd1&d2d1&d2的结果将是的结果将是36(36(由由0010011000100110与与0010110000101100进行按位进行按位与与, , 即逐位进行与运算,得结果即逐位进行与运算,得结果0010010000100100,即,即1010进制进制的的36); 36); vd1|d2d1|d2的结果将是的结果将是46(46
58、(由由0010011000100110与与0010110000101100进行按位进行按位或,即逐位进行或运算,得结果或,即逐位进行或运算,得结果00101110); 00101110); vd1d2d1d2的结果将是的结果将是10(10(由由0010011000100110与与0010110000101100进行按位进行按位异或,即逐位进行异或运算,得结果异或,即逐位进行异或运算,得结果00001010); 00001010); 64v d11 d11 d11 的结果将是的结果将是19(19(将将0010011000100110的每一位都向右移动一的每一位都向右移动一个位后得结果个位后得结果
59、00010011); 00010011); v 将将d1d1的结果赋值给无符号字符型变量的结果赋值给无符号字符型变量d3d3,而后按,而后按intint值输值输出出d3d3将得结果将得结果217(217(将将0010011000100110的每一位都取反后得结果的每一位都取反后得结果11011001)11011001)。 65 执行如下的程序,可对上述结果进行验证执行如下的程序,可对上述结果进行验证#include void main( ) unsigned char d1=38, d2=44; coutunsigned char d1=38, d2=44;endl; coutd1=d1 d2
60、=d2endl; coutint(d1)=int(d1) int(d2)=int(d2)endl; cout-endl; cout (d1&d2)endl; cout (d1|d2)endl; cout (d1d2)endl; 66 coutd1 (d11)endl; cout1 = 1)endl; cout (d1)endl; unsigned char d3 = d1; cout-endl; coutunsigned char d3=d1;endl; cout int(d3)endl; cout- 36d1&d2 = 36d1|d2 = 46d1|d2 = 46d1d2 = 10d1d2 = 10d1 76d1 76d11 = 19d11 = 19d1 = -39d1 = -39-unsigned char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南昌市中医院胆囊癌根治术规范化操作考核
- 南京市中医院治疗随访评估考核
- 漳州市人民医院抑郁症针灸治疗考核
- 芜湖市人民医院肝门部胆管癌根治性切除考核
- 盐城市人民医院产科介入治疗技术考核
- 扬州市人民医院送气送水管道干燥度检查实操考核
- 宿迁市中医院血型血清学疑难病例考核
- 漳州市中医院骨盆髋臼骨折术中复位考核
- 池州市中医院抗衰老综合治疗考核
- 南京市中医院快速病理沟通考核
- 少儿航模教学课件
- 课件用讲义模式打印
- 宋词鉴赏课件
- 民族英雄戚继光
- 村文书考试题及答案
- 数字人产品讲解
- 养老院情况汇报
- 网络意识形工作培训讲座
- Rett综合征诊疗指南(2025年版)
- 国家开放大学《品牌管理》形考任务1-4参考答案
- 云南业委会管理办法
评论
0/150
提交评论