C++运算符与表达式PPT学习课件_第1页
C++运算符与表达式PPT学习课件_第2页
C++运算符与表达式PPT学习课件_第3页
C++运算符与表达式PPT学习课件_第4页
C++运算符与表达式PPT学习课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运算符与表达式,运算符(operator)也称为操作符,对程序中的数据进行运算。参与运算的数据称为操作数(operand)。 变量、字面常量等通过运算符组合成表达式,一个表达式也能作为操作数来构成更复杂的表达式。 表达式(expression)是构成程序语句的基本要素。,对于运算符,应注意以下几方面。 (1) 运算符的功能和语义。 (2) 运算符的操作数。每个运算符对其操作数的个数、类型和值都有一定限制。 (3) 运算符的优先级(precedence)。每个运算符都有确定的优先级。 (4) 运算符的结合性(associativity)。,1,C+语言中包含了丰富的运算符,主要有算数运算符、关系

2、运算符、逻辑运算符、赋值运算符和位运算符。下面逐一介绍这些常用的运算符。,1.1 算数运算符,算数运算符主要用于算数运算。,2,2020/8/3,注意: 对于除,若两个操作数都是整数,结果为整数(商部分)。 1/2=0 5/2=2 %通常称为取模运算,两个操作数必须都是整型数,结果为余数,余数的符号与左边数的符号等同。 3%2=1 -3%2=-1 3%-2=1 -3%-2=-1 8%4=0,在算术运算中需要注意溢出问题。,两个整数做加法、减法或乘法运算时,即便结果溢出也不是错误。 例如:short s1 = 32765; s1 = s1 + 3;/结果是否超过short的最大值? couts1

3、endl;/输出-32768,而不是32768。 实际上,观察二进制数据,这两个值是一样的。,3,2020/8/3,+和有前置方式和后置方式。前置方式使操作数增1(或减1),新值参与表达式的运算;后置方式是在操作数参与表达式运算后其值增1(或减1)。,例如: +i,-i/在使用i之前,先使i的值加1,减1 i+,i-/在使用i之后,使i的值加1,减1,一元负号运算符对运算对象值取值取负后,返回其(提升后的)副本:,Int i=1024; Int k=-i;/k是-1024 bool b=true; bool b2=-b;,b2=?,对大多数运算符来说,布尔类型的运算对象将被提升为int型。如上

4、所示,布尔变量b的值为真,参与运算时将被提升成整数值1,对它求负的结果是-1,将-1再转回布尔值并将其作为b2的初始值,显然这个初始值不等于0,转换成布尔值后应该为1,。所以,b2的值是真!(false可以代表0,但true有很多种,并非只有1),4,2020/8/3,1.2 关系运算符,关系运算符主要用于关系比较运算。,关系运算的结果是一个表示“真”或“假”的逻辑值,即一个bool值。当关系成立时,其运算结果为真;当关系不成立时,结果为假。但C/C+语言中没有逻辑型,关系运算的结果要用一个int值表示,0即为假,1即为真。,5,2020/8/3,关系运算符的优先级为(括弧中运算符的优先级相同

5、):(、=、 b = c; /等价于d = (a b) = c); d的值为0 d = a = b b b) = c); d的值为1 可以使用()来改变运算符的计算次序。,由于浮点数在计算机内进行运算和存储时会产生误差,因此在比较两个浮点数时,建议不要直接比较两数是否相等。例如,执行下面语句: double d1 = 3.3333, d2 = 4.4444; if(d1 + d2 = 7.7777) cout相等endl; else cout不等endl; coutd1 + d2endl; ,例如:a=2 b=3 c=4 a2 0 , ab+c 0 , a=2 1,a=a 0,aa 0,b=a

6、=2 1,6,2020/8/3,条件语句中用“=”来判断浮点数是否相等,结果是不等,但d1+d2输出结果却是7.7777。两个实型数即便输出结果完全一样,其内部值也可能不一样。判断两个实数是否相等的正确方法是:判断两个实数之差的绝对值是否小于一个给定的允许误差数,如判断d1是否等于d2时,应改为: fabs(d1 +d2-7.7777) = 1e-6 其中,fabs()是计算绝对值的一个库函数,使用时要包含头文件math.h。,7,2020/8/3,1.3 逻辑运算符,对逻辑值进行运算的运算符就是逻辑运算符。C+语言提供了3个逻辑运算符,用于表示操作数之间的逻辑关系,它们是!(逻辑非)、 in

7、t d = a = b; /d的值为0,10,2020/8/3,答案是有的,对于a=a+1,表达式a被计算了两次,对于复合运算符a+=1,表达式a仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就被调用了两次,而且如果使用普通的赋值运算符,也会加大程序的开销,使效率降低。,a=a+3;与a+=3;有没有区别?,11,2020/8/3,1.5 位运算符,位运算是指对字节内部的二进制位进行移位或逻辑运算。 位运算是通过位运算符来完成的。 位运算的操作数必须是char、short、或int值,而且结果也是char、short或int值。 除了按位求反

8、是单目运算符,其余位运算都是双目运算符。 C+提供了两类位运算:移位运算和按位逻辑运算。,1.5.1. 移位运算符 移位运算符的格式为: operand n 将操作数operand向右移动n个二进制位,保持符号不变。 其中,n为整数。注意移位运算并不改变operand本身的值。例如: 比如 22; 值变成8;,对于移位运算,注意以下几点: (1)不要尝试对float或double数据进行移位运算,编译会出错。 (2)移动位数n应不大于左操作数的位数,如int移位应不大于32。如果n大于左操作数位数,实际移动位数要自动按字长取模:n%(sizeof(int)。例如,i与cin可能混淆,可用括号消

9、除这些错误,例如cout(k3),12,2020/8/3,1.5.2 位逻辑运算符,按位逻辑运算有4个:求反、与 float f = 32.2f; 则计算以下表达式:a / f,处理过程为:先将a的值转换成float型,然后再进行浮点数的除法运算,结果为一个float值3.10559。在这个过程中a变量的值不改变。,规则1 两个不同类型的操作数进行运算时,先将较小范围的数值转换为另一个较大范围的数值,然后再进行计算。各种基本数据类型的数值范围从小到大排列次序如下:,20,2020/8/3,按规则1可知,两个有符号的值之间进行算术运算,其结果是有符号的。一个无符号的值与一个浮点数(如float)

10、进行算术运算,其结果是浮点数(如float)。但两个无符号的值之间进行算术运算(两个值中没有unsigned int),其结果是有符号的int。,例如: unsigned char c1 = 2; unsigned short s1 = 3; cout(c1 * s1)endl;/乘法,输出6 couttypeid(c1 * s1).name()endl;/输出int,规则2 对于bool、char、short、int类型,任意两个值之间进行算术运算、位运算,其结果都是一个int值。任意两个值之间进行逻辑运算,其结果都是一个bool值。注意规则2是规则1的一个例外。,char c1 = -2;

11、 short s1 = 3; cout(c1 * s1)endl;/乘法,输出-6 couttypeid(c1 * s1).name()endl;/输出int cout(c1 /输出bool,21,2020/8/3,规则3。对于bool、char、short、int类型,任一个类型值(无论是否带符号)与unsigned int之间进行算术运算,其结果都是unsigned int类型。注意规则3又是规则2的一个例外。,例如: char c1 = -2; unsigned short s1 = 2; unsigned int j = 3; cout(c1 * j)endl; /乘法,输出42949

12、67290,而不是-6 couttypeid(c1 * j).name()endl; /输出unsigned int cout(s1 * j)endl; /乘法,输出6 couttypeid(s1 * j).name()endl; /输出unsigned int,由上面例子可知,unsigned int被系统认为是整型数值中的最大范围的类型,因此其它类型与之计算时,都要转换到unsigned int。此时如果另一个整数恰好是负值,而结果是不带符号的正值,就不能得到预期结果,但二进制结果是正确的,例如4294967290与-6是一样的。,在处理表达式的过程中,并不是将变量直接转换成最大范围的类型

13、,而是在表达式处理过程中,按照需要逐步进行转换,例如: int i=1; char ch=2; float f= 3.0f; double df = 4.0; cout(ch*i+f*2.0-df)endl;,22,2020/8/3,表达式ch*i+f*2.0-df的计算过程为: (1) 将ch转换为int型,计算ch*i,即2*1,结果为2,类型为int。 (2) 将f转换为double型,计算f*2.0,即3.0*2.0,结果为6.0,类型为double。 (3) 将ch*i的结果2转换为double型,计算2.0+6.0,结果为8.0,类型为double。 (4) 计算8.0-df,即4

14、.0,整个表达式的结果为4.0,类型为double。 自动类型转换的基本规则是“宽化”或者“提升”,即将较小范围的数值类型转换到较大范围的数据类型。大多数自动类型转换是安全的。,3.2 赋值转换,对于基本数据类型,任意两种类型之间都可以进行赋值转换,但应注意下面情形: Doublefloat时,其指数和小数部分将缩小到float可表示的范围。如果原先double值超过了float表示的范围,将出错。 浮点数整数时,将去掉小数部分。如果原先浮点值大于整数表示的范围,将出错。 较大范围的整数(例如int)-较小范围的整数(如short),将截断高位字节,仅保留低位字节的值。如果原先数值大于小范围类

15、型可表示的范围,将将出错。 较小范围的整数(如char或float)较大范围的整数(如int或double),将保持原值不改变。,赋值类型转换出现在初始化表达式或者赋值表达式中。当初始化或赋值运算符的左值表达式的类型与右值表达式类型不同,且类型兼容时,将进行类型转换到左值类型。即先计算出右值表达式的值,然后将其转换为左值类型后再赋给左值。,23,2020/8/3,一般情况下,编译器对于可能导致数据丢失的情形会给出警告,但不完全。不经意之间就可能产生意料不到的结果。例如: int i = 2, j = 4; double df; df = i/j*100;/i/j的值为0,而不是0.5 cout

16、 df= df t;/输出0,而不是50 i = 4.6, j = 5.7;/编译时给出警告 float x = i + j; /x的值并不是10.3,而是9 = 4 + 5 cout x= x n;/输出9,3.3 强制类型转换,强制类型转换(也称显式类型转换)是由程序员用类型转换运算符明确指明的一种转换操作,将一个表达式强制转换到某个指定类型。强制类型转换的一般形式为: () 或者 (),24,2020/8/3,例如: int a = 7, b = 2; double y1 = a / b 此时y1的值是3.0。但如果程序员希望得到3.5,就要对除法的操作数进行强制类型转换如下: y1 = double(a)/b 或者 y1 = (double)a/b 或者 y1 = a / double(b);,关于强制类型转换,说明以下两点。,(1)一个强制类型转换是否正确取决于所处理的值的范围,一般来说,强制转换是不安全的。,(2) 类型强制转换作用于一个表达式,并非作用于数据存储单元,即不改变变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论