《第2章 运算符和表达式》由会员分享,可在线阅读,更多相关《第2章 运算符和表达式(84页珍藏版)》请在金锄头文库上搜索。
1、第 2 章运算符和表达式程序与数据的关系程序与数据的关系 数据的输入数据的输入程序由程序由 数据的处理数据的处理 三部分组成三部分组成 数据的输出数据的输出 数据是程序处理的对象和结果。数据是程序处理的对象和结果。数值数据的种类数值数据的种类常量:在程序运行过程中,其常量:在程序运行过程中,其 值不能被改变的量;值不能被改变的量;变量:在程序运行过程中,其变量:在程序运行过程中,其 值能被改变的量。值能被改变的量。变量的三要素变量的三要素n 变量的标识符(变量名)变量的标识符(变量名)n 变量的值变量的值n 变量的数据类型变量的数据类型3a存储单元存储单元变量名变量名变量值变量值标识符的命名规
2、则标识符的命名规则n 由英文字母、数字和下划线组成,且必须以英由英文字母、数字和下划线组成,且必须以英文字母或下划线开头;文字母或下划线开头;n 不允许使用保留字作标识符的名字,也不应该不允许使用保留字作标识符的名字,也不应该跟库函数名重名;跟库函数名重名;n 标识符命名应以直观且易于拼读为宜,最好使标识符命名应以直观且易于拼读为宜,最好使用英文单词及其组合,力争做到用英文单词及其组合,力争做到“见名知意见名知意”,以便于记忆和阅读;以便于记忆和阅读;n 标识符区分大、小写,标识符区分大、小写,sum、Sum、SUM是三是三个不同的标识符,常用的是小写,少数场合要用个不同的标识符,常用的是小写
3、,少数场合要用大写字母开头,个别场合要全部大写。大写字母开头,个别场合要全部大写。变 量 的 定 义 变量必须遵循“先定义,后使用”的原则,即每个变量在使用之前都要用变量定义语句将其声明为某种具体的数据类型。变量定义语句的形式如下:类型关键字 变量名简单数据类型简单数据类型基本整型基本整型 int短整型短整型 short长整型长整型 long无符号整型无符号整型 unsigned int无符号短整型无符号短整型 unsigned short无符号长整型无符号长整型 unsigned long字符型字符型 char整整数数类类型型简简单单数数据据类类型型字字符符型型 短整型数短整型数32767加
4、加1后等于多少后等于多少?#includevoid main() short a,b; a=32767; b=a+1; cout“a=”a“,b=”bendl;#includevoid main() cout“char:”sizeof(char)endl; cout“short:”sizeof(short)endl; cout“int:”sizeof(int)endl; cout“long:”sizeof(long)endl;变量定义数据类型的目的变量定义数据类型的目的1. 决定了编译系统为该类型变量分配内存单元决定了编译系统为该类型变量分配内存单元的字节数;的字节数;2. 决定了该类型变量内
5、存单元中能够存放的数决定了该类型变量内存单元中能够存放的数据类型;据类型;3. 决定了该类型变量数据的存放形式;决定了该类型变量数据的存放形式;4. 决定了该类型变量的合法取值范围;决定了该类型变量的合法取值范围;5. 决定了该类型变量可参与的运算种类。决定了该类型变量可参与的运算种类。 1. 决定了编译系统为该类型变量分配内存单元的字节数决定了编译系统为该类型变量分配内存单元的字节数基本整型基本整型 int 4 32短整型短整型 short 2 16 长整型长整型 long 4 32无符号整型无符号整型 unsigned int 4 32无符号短整型无符号短整型 unsigned short
6、 2 16 无符号长整型无符号长整型 unsigned long 4 32字符型字符型 char 1 8整整数数类类型型简简单单数数据据类类型型字字符符型型2. 决定了该类型变量存储单元中能够存放的数据类型决定了该类型变量存储单元中能够存放的数据类型1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0字符型字符型短整型短整型 短整型变量的存储空间可以存放字符型变短整型变量的存储空间可以存放字符型变量的数据,字符型变量的存储空间不能存放量的数据,字符型变量的存储空间不能存放256 以上的短整型数据。以上的短整型数据。
7、举例:举例:无处存放无处存放#includevoid main() short i=289; char c; c=i; coutcendl;0 00 00 00 00 00 00 01 10 00 01 10 00 00 00 01 1short i = 289;0 00 01 10 00 00 00 01 1charchar c;c=i;coutcendl;c=33(! 号的号的ASCII码)码)3. 决定了该类型变量数据的存放形式决定了该类型变量数据的存放形式整型数据在内存中的存放形式整型数据在内存中的存放形式short int i;i=10;10 =(1010)20 0 0 0 0 0
8、0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0+short int j;j= -10;1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0整型数值都是以补码的形式存放的整型数值都是以补码的形式存放的字符型数据在内存中的存放形式字符型数据在内存中的存放形式char c = a; 字符字符a的的ASCII码是码是 97c970 01 11 10
9、 00 00 00 01 1实际上在实际上在1个字节的空间里存放的是个字节的空间里存放的是字符所对应的字符所对应的ASCII码的码值码的码值4. 决定了该类型变量的合法取值范围决定了该类型变量的合法取值范围(以短整型为例)(以短整型为例)0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0+32767- 32768有符号短整型数的数值范围是:有符号短整型数的数值范围是:- 32768 +32767
10、0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1065535无符号短整型数的数值范围是:无符号短整型数的数值范围是: 0 65535无符号短整型数无符号短整型数5. 决定了该类型变量可参与的运算种类决定了该类型变量可参与的运算种类例如:求余运算符例如:求余运算符 % 规定:规定: (被除数被除数) a % b(除数)(除数)( a、b 均为整数)均为整数)5 % 3 = 2只有整数能参与求余运
11、算只有整数能参与求余运算使用变量时的注意事项使用变量时的注意事项1. 使用变量的基本原则:必须使用变量的基本原则:必须“先定义,后使用先定义,后使用”;2.2. 注意区分变量名和变量值的概念。变量名标识一注意区分变量名和变量值的概念。变量名标识一个个 具体的存储单元,变量值则是存放在存储单元具体的存储单元,变量值则是存放在存储单元中的数据;中的数据;3.3. int型变量隐含的修饰类型是型变量隐含的修饰类型是有有符号(符号(signed););4.4. 变量所占存储空间的大小,可用变量所占存储空间的大小,可用sizeof(int)之类之类的方式进行测定;的方式进行测定;5.5. 注意注意cha
12、r型数据与型数据与int型数据之间的关系。型数据之间的关系。char型数据以其型数据以其ASCII码值参与码值参与int型的运算和存储;型的运算和存储;基本运算符基本算术运算符基本算术运算符+ (加法运算符、取正运算符加法运算符、取正运算符)- (减法运算符、取负运算符减法运算符、取负运算符)* (乘法运算符乘法运算符)/ (除法运算符除法运算符)% (求余运算符或称模运算符求余运算符或称模运算符)算术运算符的优先级和结合性算术运算符的优先级和结合性+ 取正取正- 取负取负* 乘法乘法/ 除法除法% 求余求余+ 加法加法- 减法减法单目运算符单目运算符 2 级级 右结合性右结合性 双目运算符双
13、目运算符 3 级级 左结合性左结合性双目运算符双目运算符 4 级级 左结合性左结合性3- 5- 1- 3- 2- 35- 1-32求余运算,余数符号跟被除数相同求余运算,余数符号跟被除数相同5 / 3 =1 , -5 / 3 = -1除法运算,商除法运算,商“向零取整向零取整”舍去小数部舍去小数部分分使用算术运算符的注意事项使用算术运算符的注意事项1.两个整型数相除的结果仍为整型两个整型数相除的结果仍为整型数,且采用商数,且采用商“向零取整向零取整”的原的原则舍去小数部分;则舍去小数部分;2.在求余运算中,两操作数均为整在求余运算中,两操作数均为整型数,余数的符号跟被除数相同;型数,余数的符号
14、跟被除数相同;任务 2-1 整型变量a的初值等于12,通过下列表达式的运算,a的终值是多少?a+ = a- = a*a;赋值运算符赋值运算符= a=3 += a += 3 a = a + 3 -= a -= 3 a = a - 3 *= a *= 3 a = a * 3 /= a /= 3 a = a / 3 %= a%=3 a = a % 314 级级 右结合性右结合性复复合合赋赋值值运运算算符符变量赋值原理变量赋值原理举例说明:举例说明: int a=0,b=0,c=0; a=7; b=a; c=a+b; a=a+1;变量的赋值过程图示变量的赋值过程图示00000077777781414a
15、的存储单元的存储单元 b的存储单元的存储单元 c的存储单元的存储单元定义并初始化定义并初始化执行执行 a=7执行执行 b=a执行执行 c=a+b执行执行 a=a+11+对变量赋值应注意对变量赋值应注意 在变量定义时就赋初值是好的在变量定义时就赋初值是好的编程习惯;编程习惯; 对变量的赋值过程是对变量的赋值过程是 “覆盖覆盖” 过程,即用新值去替换旧值;过程,即用新值去替换旧值; 读变量的值,相当于从该空间读变量的值,相当于从该空间中复制出一份同样的拷贝,该变中复制出一份同样的拷贝,该变量仍保持不变量仍保持不变 。赋值过程时的注意事项赋值过程时的注意事项n 将一个将一个short型数据赋予一个型
16、数据赋予一个char型变量,会发生截断型变量,会发生截断n 字符型数据赋予整型变量,是字符型数据赋予整型变量,是将字符的将字符的ASCII码值赋予整型变量码值赋予整型变量赋值表达式1. 构成:将一个变量和一个表达式用赋值号构成:将一个变量和一个表达式用赋值号连接起来的式子称为赋值表达式。连接起来的式子称为赋值表达式。2.2. 特点:特点:“=”是赋值运算符,是赋值运算符,14级,右结级,右结合性。合性。3. 故可写成:故可写成:a=b=c=d;(其他语言不可如;(其他语言不可如此表示,即使在此表示,即使在C+语言中,在变量初始化语言中,在变量初始化时也不可以如此表示。)时也不可以如此表示。)4
17、.注意:赋值表达式与赋值语句的区别注意:赋值表达式与赋值语句的区别5. a=b 是赋值表达式是赋值表达式 a=b; 是赋值语句是赋值语句 整型变量整型变量a a的初值等于的初值等于1212,通过下列表达式,通过下列表达式的运算,的运算,a a的终值是多少?的终值是多少?a+ = a- = a*a; 复合赋值运算符属复合赋值运算符属14级,具有右结合性;乘法运级,具有右结合性;乘法运算符属算符属3级,故该题的实际运算步骤为:级,故该题的实际运算步骤为:a+=( a-=( a*a )a+=( a-=( a*a )即先算:即先算: a = a - ( 12*12 )a = a - ( 12*12 )
18、,a = 12 a = 12 144 144 = -132 = -132再算:再算:a = a + (-132)= -132 + ( -132 )a = a + (-132)= -132 + ( -132 ),整型变量整型变量a的终值为:的终值为:-264-264上题变量上题变量a的值在存储单元中的变化情况示意如下:的值在存储单元中的变化情况示意如下:a-132a12-132-26412a-264a变量赋值遵守变量赋值遵守“以新冲旧以新冲旧”的原则的原则自增自增1和自和自减减1 运算符运算符自增自增1运算符运算符: +自减自减1运算符运算符: - -使用方式使用方式: 变量变量+,变量,变量-
19、 ;(后置);(后置)优先级:优先级:2级级结合性:右结合性:右 i+:先使用先使用i的原值,在使用的原值,在使用i之后,之后,使使i的值加的值加1,即,即i=i+1; 如果如果i的原值为的原值为3,则执行,则执行j=i+之后,之后,j的值仍为的值仍为3,然后,然后i的值变为的值变为4; i-:先使用先使用i的原值,在使用的原值,在使用i之后,之后,使使i的值减的值减1,即,即i=i-1; 如果如果i的原值为的原值为3,则执行,则执行j=i-之后,之后,j的值仍为的值仍为3,然后,然后i的值变为的值变为2;使用增使用增1和减和减1运算符的注意事项运算符的注意事项1.增增1运算符和减运算符和减1
20、运算符只能用于变量,运算符只能用于变量,不能用于常量和表达式;如:不能用于常量和表达式;如:5 + 和和(a+b)+均为非法;均为非法;5是常量,常量的值不能改变;是常量,常量的值不能改变;假如假如(a+b)的值为的值为5,执行,执行(a+b)+后后的的6放到哪个存储单元去呢?放到哪个存储单元去呢?使用增使用增1和减和减1运算符的注意事项运算符的注意事项2. 要十分注意增要十分注意增1和减和减1运算符是右结合运算符是右结合性的,当出现同级运算时应选取从右性的,当出现同级运算时应选取从右到左的方向进行运算;到左的方向进行运算;运算符结合性的应用运算符结合性的应用int m,i=3;m = - i
21、+; 求负运算符和增求负运算符和增1运算符同为运算符同为2级,属右结合性级,属右结合性上式等效于:上式等效于:m = - ( i+ )属后置,即属后置,即:m = - i;i = i+1;因此,结果应是:因此,结果应是:m = -3;i = 4;m m的值先等于的值先等于i i的原值的原值 3 3,再进行求负运算最后等于,再进行求负运算最后等于 -3-3任务2-2 编程输出一个由键盘输入的100以内的正整数x的值。(超过此范围要求给出提示) 从数学知识来说,x应满足: x0 与 x100 要同时成立; 此题涉及到了关系运算 逻辑运算要选出这个数并将其输出,还涉及到 条件运算 100以内的正整数
22、x的范围: x0 与 x100关系运算和逻辑运算 C+的关系运算符 (小于) (大于)= (大于或等于)= (等于)!= (不等于)6 级级7 级级 关系运算符完成对两个操作数大小的比较,结果为逻辑值true(真)或false(假)。每种可比较大小的数据类型,都要用上关系运算符。 在C+中这两个逻辑值与整数之间有一个对应关系,真对应1,假对应0;反过来,0对应假,非0整数对应真。所以关系运算结果可以作为整数参与算术运算、关系运算、逻辑运算及其他运算。关系表达式例如:例如:abc /*等同于等同于(ab)c,先求,先求ab 的值,的值, 再将结果再将结果0或或1与与c比较大小比较大小*/a+bc
23、+d /*等同于等同于(a+b)(c+d),结果为,结果为0或或 1*/y=ab /*计算计算ab的值的值0或或1赋给赋给y,y的值为的值为 0或或1*/由关系运算符连接的表达式,其值为由关系运算符连接的表达式,其值为true或或false。已知已知 a=3, b=2, c=1, 则:则:关系表达式关系表达式 a b c 的值为的值为“ ” 表达式的值为表达式的值为: 0 ; (ab)= c 的值为的值为“ ” 表达式的值为表达式的值为: 1 ;赋值表达式赋值表达式 f = a b c f的值为的值为: ; f = a ( b c ) f的值为的值为: ;真真01假假 C+逻辑运算符 & 逻辑
24、与逻辑与 11 级级 | 逻辑或逻辑或 12 级级 ! 逻辑非逻辑非 2 级级记忆方法记忆方法“逻辑与逻辑与”相当于相当于“逻辑乘逻辑乘”a ab ba&ba&b0 00 00 01 10 00 00 01 10 01 11 11 1“逻辑或逻辑或”相当于相当于“逻辑加逻辑加”a ab ba|ba|b0 00 00 01 10 01 10 01 11 11 11 11 1优优先先级级运运算算符符名名 称称语语 义义2!逻辑非逻辑非 (单目单目)操操作作数数的的值值为为真真,则则结结果为假果为假;11&逻辑与逻辑与(双目双目)当当两两个个操操作作数数全全为为真真时时,结果为真,否则为假结果为真,
25、否则为假;12|逻辑或逻辑或(双目双目)两两个个操操作作数数中中有有一一个个为为真,则结果为真真,则结果为真;逻辑运算符 逻辑运算符用来进行逻辑运算,其操作数逻辑运算符用来进行逻辑运算,其操作数和运算结果均为和运算结果均为逻辑量逻辑量。运算结果同样可以。运算结果同样可以作为一个作为一个整数整数参与其他运算。参与其他运算。 由于由于逻辑值逻辑值和和整数整数之间的之间的对应关系对应关系,也允许,也允许整整型型和和字符型字符型操作数进行操作数进行逻辑运算逻辑运算。此时将它们视。此时将它们视作非零数:作非零数:21&0/逻辑与逻辑与,21与与0,结果为假结果为假:021|0 /逻辑或逻辑或,21或或0
26、,结果为真结果为真:1!21/逻辑非逻辑非,21的非的非,结果为假结果为假:0条件运算符表达式1 ?表达式2 : 表达式3例如:max=(ab?a:b)条件运算和条件表达式条件运算符(条件运算符( ? : ) (优先级为(优先级为13级,结合性为右结合性)级,结合性为右结合性) 要求有要求有3个操作对象,称三目个操作对象,称三目(元元)运算符,运算符,它是它是C+运算符中唯一运算符中唯一的一个的一个“三目三目”运运算符。条件表达式的一般形式为:算符。条件表达式的一般形式为: 表达式表达式1?表达式表达式2:表达式表达式3条件运算符的执行顺序是:先求解表达式先求解表达式1, 若为若为非非0(真)
27、(真)则则求解表达式求解表达式2, 此时此时表达式表达式2的值的值就作为就作为整个条件表整个条件表达式的值。达式的值。 若表达式若表达式1的值的值为为0(假),(假),则则求解求解表达式表达式3, 表达式表达式3的值的值就是就是整个条件表达式的整个条件表达式的值。值。 max=(ab)?a:b; 具体是这样执行的:具体是这样执行的: 如果(如果(ab)条件为真,则条件表达)条件为真,则条件表达式的值就取式的值就取“?”后面的值,即条件表后面的值,即条件表达式的值为达式的值为a,把,把a的值赋给的值赋给max; 否则条件表达式的值为否则条件表达式的值为“:”后面的后面的值,即条件表达式的值为值,
28、即条件表达式的值为b,把,把b的值的值赋给赋给max。完成任务2-2:#includevoid main() int x; coutx; x=0 ? coutx : cout“该数不在此范围该数不在此范围”; coutendl;任务 2-3 编写程序实现逻辑位运算。位运算 在计算机用于检测和控制领域中,常常要处理二进制位的问题,对于操作数以二进制位(bit)为单位进行的数据处理称为位运算。 位运算包括逻辑位运算和移位位运算两类,参加位运算的操作数必须是整型的常量或变量。逻辑位运算符 功能 运算符 优先级 举例 位反 2 a 位与 & 8 a&b 位异或 9 ab 位或 | 10 a|b逻辑位运
29、算的功能 a b a a&b a|b ab 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 1 0 1 1 0 其中,异或运算的功能是:“若异则进行或运算”,即当参与运算的两个数不同(一真一假)时,结果为真,否则为假。任务 2-4 编程描述左、右移位运算。移位运算符 功能 运算符 优先级 举例 等价于 左移 5 a 5 a2 a右移2位左移运算 当进行左移运算时,右端出现的空位补0,而左端移出的数据舍去;已知:c=44=(00101100) ; c=c2=(00111100) = 60右移n位相当于原数除以2 ;22n b=-16=(10010000) b2=(10
30、000100) = -422 b =10010000 b =11101111 b =11110000 b =11111100 b =11111011 b =10000100 b2后:原原原原反反反反补补补补 带符号操作数右移时,左端出现的空位按原高位复制; 无论什么操作数,右端移出的数均舍去。 移位运算的优先级低于算术运算,但比乘除运算速度快。 #include void main() int a,b,c; a=240; b=-16; c=44; cout“右移二位a=”2)endl; cout“右移二位b=”2)endl; cout“左移二位c=”(c2). -成员选择成员选择( )( )函
31、数参数域函数参数域2 2+ -+ -自增自增 自减自减右右 左左单目单目 &取地址取地址* *取内容取内容! !逻辑反逻辑反( (非非) ) 按位反按位反+ -+ -取正取正 取负取负( )( )强制类型转换强制类型转换size ofsize of求字节数求字节数* *指针定义指针定义常用运算符的功能、优先级和结合性优先级优先级运算符运算符功能说明功能说明结合性结合性记忆方法记忆方法3 3* * / %/ %乘法乘法 除法除法 求余求余 左左 右右双目双目算算术术4 4+ -+ -加法加法 减法减法5 5左移位左移位 右移位右移位 移位移位6 6 = =小于小于 不大于不大于 大于大于 不小于
32、不小于关关系系7 7= != !=相等相等 不相等不相等8 8&按位与按位与位逻辑位逻辑9 9 按位异或按位异或1010| |按位或按位或1111&逻辑与逻辑与逻逻辑辑1212| |逻辑或逻辑或1313? :? :条件运算符条件运算符右右 左左三目三目1414= += -= *= /= %= = += -= *= /= %= &= = |=&= = |=赋值运算符赋值运算符赋值赋值1515, ,逗号运算符逗号运算符左左 右右逗号逗号任务 2-6 #include void main() char c1=a, c2=b, c3=c, c4=101, c5=116; cout“1234567890
33、1234567890”endl; cout“a”c1“ b”c2“tc”c3“tabc”endl; cout“t”c4“ ”c5endl; 分析以下程序的输出结果:常常 量量 常量是一种在程序运行过程常量是一种在程序运行过程中保持固定类型和固定数值的中保持固定类型和固定数值的数据。数据。常量常量字面常量字面常量字符常量字符常量字符串常量字符串常量数值型常量数值型常量符号常量符号常量整型常量整型常量实型常量实型常量常 量 的 分 类整型常量整型常量 十进制十进制 (Dec) 56 = 56 八进制八进制 (Oct) 021 = 17 十六进制十六进制(Hex)0X1F = 31前导符前导符整型常
34、量隐含按有符号整型处理;整型常量隐含按有符号整型处理;256L(长整型)、(长整型)、256U(无符号整型)、(无符号整型)、30LU(无符号长整型)(无符号长整型)后缀后缀字符常量字符常量由一对单引号括起来的一个字符,如:由一对单引号括起来的一个字符,如: a、 2、 #等;等;注意:注意: B是字符常量,是字符常量,B是标识符;是标识符; 3表示一个字符,表示一个字符,3表示一个整表示一个整数数特殊:转义字符特殊:转义字符 转变含义的字符。转变含义的字符。常用的转义字符常用的转义字符 n 换行,将光标从当前位置移到下一行开头换行,将光标从当前位置移到下一行开头 t 水平制表(将光标跳到下一
35、个制表位)水平制表(将光标跳到下一个制表位) 0 空字符空字符(用于作串结束符用于作串结束符) ddd 13位八进制数所代表的字符位八进制数所代表的字符 #include void main() char c1=a, c2=b, c3=c, c4=101, c5=116; cout“12345678901234567890”endl; cout“a”c1“ b”c2“tc”c3“tabc”endl; cout“t”c4“ ”c5endl; 12345678901234567890aa bbccabcA N字符串常量字符串常量由一对双引号括起来的一个字符系列串,如:由一对双引号括起来的一个字符系列串,如:“123”注意:注意: “a”是字符串常量,占二个字节,是字符串常量,占二个字节,相当于相当于 a和和 0; a是一个字符常量,占一个字节;是一个字符常量,占一个字节;