




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章 运算符和表达式 * 表达式 在C+中,运算符和表达式是实现数据操 作的两个重要组成部分。 表达式是由变量、常量、函数等通过一个 或多个运算符组合而成的式子。 表达式中,变量、常量、函数等都是运算 符的运算对象,称为操作数。 例:(2*x+a)*sin(b)-20 2C+实用教程 运算符 根据运算符的操作数的个数不同,可将其 分为 单目(一元):对一个操作数运算 双目(二元):对二个操作数运算 三目(三元):对三个操作数运算 P.580 表E.1 C+常用运算符一览表 3C+实用教程 优先级操作符结合性 1:左右 2. - ( ) 左右 3+ - ! - + int main() for(int i=0;i) () 11C+实用教程 类型转换的顺序 整型 (int) 无符号长整型 (unsigned long) 长整型 (long ) 无符号整型 (unsigned) 短整型,字符型 (short,char) 双精度实型 (double) 单精度实型 (float) 长双精度实型 (long double) 12C+实用教程 1.自动转换 字符型、整型、实型之间可以进行混合运算,其 中字符型数据以ASC码的十进制数参与运算。 运算时,不同类型的数据要先转换成同一类型, 然后进行运算。 转换规则: 类型转换由系统自动完成。转换总是朝表达数据能力 更强的方向,并且转换总是逐个运算符进行的。 例如:int i=10; long l=4; float f=5.0; double d=1.25; 则:i+a+ 2*d - f/l 运算结果为double型的108.25 13C+实用教程 2.强制转换 功能:将一个表达式的值转换成某个类型 格式:(类型名) (表达式) 说明: 括号必须有,但是,如果表达式是单个操作数,其括 号可以省。 例如:(int) x (int) (x+y) 一般,系统对操作数自动进行类型转换,但如果: a%b 要求a和b都是整型,如果不是,必须先进行转换 : (int)a%b (int)a%(int)b 转换后只得到一个中间变量,被转换的变量的类型不 变。 14C+实用教程 3.1.4 代数式和表达式 为了能让C程序进行数值计算,还必 须将代数式写合法的C表达式。 (1)注意书写规范 (2)注意加圆括号 (3)注意数据类型 (4)注意符号 15C+实用教程 3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算 16C+实用教程 3.2 赋值运算符 在C+中,赋值运算是使用赋值运算符 “=”来操作的,它是使用最多的双目运算 符。 赋值运算符“=”的作用是将赋值符右边操作数 的值存储到左边操作数所在的内存空间。 赋值符“=”左边的操作数必须是左值 。 赋值表达式的值和类型是左值的值和类型。 17C+实用教程 3.2.1 左值和右值 左值(L-value):能出现在赋值表达式左边的 表达式。左值表达式具有存放数据的空间,并且 存放是允许的。 例如: int a=3; 右值:只能出现在赋值表达式右边的表达式。 说明:左值既可以出现在赋值运算符的左边,又可以 出现在右边 例如:int a;const int b=6; a=b+8; b=8; (a=4)=8; 32=a+2; /a是左值,b+8为右值 /error, b是常量,只能作右值 /a=4是左值表达式,可以被赋值 /error, 32是常量,只能作右值 18C+实用教程 3.2.2 数值截取和数值溢出 赋值表达式的值和类型是左值的值和类型 。 在赋值表达式中,当右值的数据类型低于 左值的数据类型时,C+会自动进行数据 类型的转换。 若右值的数据类型高于左值的数据类型且 不超过左值的范围时,C+会自动进行数 值截取。 如果一个数值超出一个数据类型所表示的 数据范围,则会出现数值溢出。 19C+实用教程 数值溢出 进行算术运算时,很可能溢出结果。发生 溢出是由于一个变量被赋予一个超出其数 据类型表示范围的数值。 数值溢出不会引起编译错误,只要分母不 为0就不会引起除0运行故障,但会使运行 结果发生偏差。 例如: short int weight = 42896 ; cout pusing namespace std; pint main() p pshort nTotal, nNum1, nNum2; pnNum1 = 1000;nNum2 = 1000; pnTotal = nNum1*nNum2; pcout=右移位赋 值 22C+实用教程 3.2.3 复合赋值 10种复合赋值运算符都是在赋值符“=”之 前加上其他运算符而构成的。 在复合赋值运算符之间不能有空格。 复合赋值运算符的优先级和赋值符的优先 级一样,在C+的所有运算符中只高于逗 号运算符,而且复合赋值运算符的结合性 也和赋值符一样,是从右至左。 23C+实用教程 3.2.4 多重赋值 多重赋值是指在一个赋值表达式中出现两 个或更多的赋值符“=”。 赋值表达式几乎可以出现在程序的任何地 方,由于赋值运算符的等级比较低,因此 这时的赋值表达式两边要加上圆括号。 24C+实用教程 #include using namespace std; int main() int a(2),b,c,d=3; cout) sizeof() 27C+实用教程 3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算 28C+实用教程 3.4 逗号运算符 逗号运算符”,”把多个表达式连接起来, 构成一个逗号表达式 在计算时,C+将从左至右逐个计算每个表达 式,最终整个表达式的结果是最后计算的那个 表达式的类型和值,即表达式n的类型和值。 逗号运算符“,”的优先级是最低的,必要时注意 加圆括号,以使逗号表达式的运算次序先于其 他表达式。 表达式1, 表达式2, 表达式3, , 表达式n 29C+实用教程 3.4 逗号运算符 例:如果a=5,表达式 a=3*5,a*4 的值为 即:a=3*5,a*4 注意:表达式 a=3*5,a*4 与 a=(3*5,a*4) 的区别 例:如果a=5,表达式a=(3*5,a*4)的值为 逗号表达式可以嵌套: 例:如果a=5,表达式 (a=3*5,a*4),a+5的值为 即:a=3*5,a*4 这时的a=15 所以:a+5 就等于20 60 20 30C+实用教程 3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算 31C+实用教程 3.5 自增和自减 单目运算符自增(+)和自减(-)为左 值加1或减1提供一种非常有效的方法。 自增(+)和自减(-)运算符既可放在 左值的左边,也可以出现在左值的右边, 分别称为前缀运算符和后缀运算符。 前缀运算符、后缀运算符和其他的运算符组合 在一起,在求值次序上就会产生根本不同。 32C+实用教程 自增: + +i :先加1后使用 i+ :先使用后加1 例:i=3; j1=+i; j1=4 相当于执行:i=i+1; j1=i; j2=i+; j2=3 相当于执行:j2=i; i=i+1; 自减: - -i :先减1后使用 i- :先使用后减1 例:i=3; j1=-i; j1=2 相当于执行:i=i-1; j1=i; j2=i-; j2=3 相当于执行:j2=i; i=i-1; 3.5.1 一般用法 33C+实用教程 3.5.2 前缀和后缀的区别 由于前增量操作返回的值即修改之后的变量值, 所以返回的仍然是一个左值。例如: int a=3; +(+a); /ok: +a是左值。a的值是5 由于后增量操作返回的值是原先a的值,而后a 的值已经发生变化,故返回的不能是当前a,只 能是过去的a值,不能是左值。例如: int a=3; +(a +); /error: a+不是左值 34C+实用教程 注意事项 (1)前缀自增或自减表达式的结果仍为一个左 值,而后缀自增或自减表达式的结果不是左值。 对于等级相同的单目运算符来说,哪一个运算符 靠近操作数,就和哪个运算符先结合。 (2)自增或自减运算符是两个“+”或两个“-”的 一个整体,中间不能有空格。如果有多于两个 “+”或两个“-”连写的情况,编译时会首先识别自 增或自减运算符。 (3)在有自增或自减运算符的混合运算中,一 要注意次序,二要注意左值对应于一块内存空间 这个特性 (4)在cout语句中的自增或自减运算中,不同 编译器的处理方式也是不一样的。 35C+实用教程 操作符的识别 编译器采用贪吃法则 如果有多于两个+或两个-连写的情况,则编译 首先识别前面两个+或-为增量或减量操作符。 int a = 3, b = 5, c; c = a + b ; / ok; c = a + b ; / 错: 理解为a+ b c = a + b; / ok: a+ +b c = a + b; / 错: 理解为a+ +b c = a + b; / 错: 理解为a+ + +b 36C+实用教程 3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算 37C+实用教程 3.6 位运算 运算符描述 位逻辑 运算 按位求反,单 目 / 00001100 short b = 6 ; / 00000110 c = a / 00000100 =4,比较a / 00001100 int b = 6; / 00000110 c = a | b为 / 00001110 =14,比较a | b 39C+实用教程 3.6.1 位逻辑运算 位异或操作 将两个操作数每一位做异或操作。若两个操作 数相等,值为0;若两个操作数不等,值为1。 int a = 12; / 00001100 int b = 6; / 00000110 c = a b; / 00001010 =10 位反操作 将一个操作数的每一位取反,0变1,1变0。 int a = 12; / 00001100 b = a / 11110011 40C+实用教程 左移操作 对于有符号数,若最高位是1,则高位挤进去1;最高 位是0,则高位挤进去0; 对于无符号数,则一律高位挤进去0; short int a = -2; / 11111111 11111110 a = a1; / 11111111 11111111 =-1 unsigned short int b = 65535; / 11111111 11111111 b = b1; / 01111111 11111111 =32767 3.6.2 移位运算 41C+实用教程 例Ex_BitOP 位运算实例 p#include p#include p / 由于后面用到setw格式算子,故添加此头文件 pusing namespace std; pvoid out2( unsigned n ) p / 定义一个函数,将一个无符号整型数n按二进制数输出 p punsigned nBits = sizeof(n) * 8; / 计算一个整型变量所占的 位数 pwhile ( nBits 0) p pcout(nBits-1) / 先向右移位再按位与 pnBits-; p pcout“【“n“】“endl; p 42C+实用教程 pint main() p punsigned bits = sizeof(unsigned) * 8; pcout“本机无符号整型的位数为:“bitsendl; pcout“ “; pout2(1234);/ 调用函数 pcout“ “; pcoutsetw(bits)“endl; p / setw用来设置下一个对象的输出宽度 pcout“ “; pout2( 7 ); / 调用函数 pcout“ “; pcoutsetw(b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家乡自来水管理制度
- 库房材料员管理制度
- 应急安置点管理制度
- 录课室使用管理制度
- 循环水节能管理制度
- 心理科工作管理制度
- 心脏功能室管理制度
- 快递签收单管理制度
- 急冻间进出管理制度
- 总承包考勤管理制度
- 江苏省苏州市相城区2024年五年级数学第二学期期末调研试题含解析
- 矿山企业会议管理制度
- 人教版七年级下册英语单词变形
- 广东中山市2023-2024学年三年级数学第二学期期末学业水平测试试题含解析
- (高清版)AQ 1056-2008 煤矿通风能力核定标准
- 《学前儿童健康教育》6-2学前儿童安全教育的目标和内容课件
- 《建筑施工塔式起重机安装、使用、拆卸安全技术规程》(JGJ196-2010)
- 2024年陕西初中地理学业水平考试试卷答案讲解课件
- 管理大略与领导小言智慧树知到期末考试答案章节答案2024年山东大学
- DL-T904-2015火力发电厂技术经济指标计算方法
- 劳动合同书版范本
评论
0/150
提交评论