您好,欢迎访问三七文档
四计算表达C++程序设计教程(第二版)回顾了解基本数据类型。了解字符串及其函数的使用。了解指针与引用的使用。目标掌握C++常用的操作符。掌握各种关系符的使用。掌握各种操作符的优先级了解表达式的副作用及消除副作用的方法。1.1基本概念2-1操作符也称为运算符,一个动作或动作序列。实体具有一定大小的内存空间,具有类型。常量只读实体,不能进行写访问,编译器优化。表达式操作符、操作数的按规则排列的序列。赋值表达式为变量进行赋值的表达式。1.1基本概念2-2条件表达式条件语句中的条件部分。具有值的表达式,取值true、false逗号表达式以逗号分隔的表达式,值为最后一个表达式的值,如d=(a=2,b=a+5,a*b);结果为d=14。左值与右值对于赋值表达式而言。左值可以是变量,右值是常量。左值不但有空间实体,还具有读写访问权,右值可以是不占据内存空间的临时量或字面值,是不具有写入权的空间实体,如inta=3;constintb=5;a=b+2;//a是左值,b+2是右值b=a+2;//错:b拥有空间但无写入权,不能做左值1.2操作符汇总优先级操作符结合性1::左2.-[]()左3++--~!-+&*()sizeofnewdeletecast右4.*-*左5*/%左6+-左7左8==左9==!=左10&左11^左12|左13&&左14||左15?:右16=*=/=+=-=右17throw左18,左域操作符单目操作符双目操作符三目操作符赋值操作符1.3赋值运算符运算符结果=将右操作数中表达式的结果赋给左值*=左值和右运算符表达式相乘再将结果赋给左值/=左值和右运算符表达式相除再将结果赋给左值%=左值和右运算符表达式相除再将余数赋给左值+=右运算符表达式的结果与左值相加-=右运算符表达式的结果与左值相减1.4一元运算符2-1运算符含义返回值*间接引用由运算符指向的变量、对象或函数&地址运算符的地址,不能是一段位区域&引用作为另一个变量的假名地址-减操作数的负值,必须是算术数据类型()计算紧接在运算符后面的操作数的数据类型暂时同括号内的数据类型sizeof数据类型大小要求存储操作数规定的数据类型的大小new申请内存完成动态内存分配和初始化(C中是malloc)delete释放内存完成清理与释放内存工作(C中是free)1.4一元运算符2-2运算符含义返回值~位反操作将一个操作数的每一位取反,0变成1,1变成0!逻辑操作布尔值。当操作数的值为假时,则返回真prefix++前增量在表达式还未计算前就增加操作数的值postfix++后增量先计算表达式的值,再增加操作数的值prefix--前减量在表达式还未计算前就减小操作数的值postfix--后减量先计算表达式的值,再减小操作数的值1.5算术运算符运算符结果+a+b,和-a-b,差*a*b,积/a/b,除法运算符,得到商%a%b,取模运算符,得到余数2.1算术运算2-1char的取值范围为0~255,因此超出此范围之后,数据将被截取,通过对256(28)取余计算而得。任何数据类型都存在取值范围的问题,因此编程要考虑语言描述的局限性。示例:usignedchara=149;usignedcharb=200;usignedcharc=a+b;c=932.1算术运算2-2数据在计算过程中,中间结果有可能出现溢出的情况,此时就可能导致最终结果错误。示例inta=100000;intb=100000;intc=1000;couta*b/cendl;结果错误2.2浮点数的比较浮点数进行相等比较时,由于浮点数一般都存在误差,因此使用==或!=运算符比较的结果通常是有问题的,因此,一般采用两个浮点数的相减,判断其差是否在一个合理的范围内。由于float和double精度不同,因此,同一个数的在计算机内部的表示也是不同的。为了进行比较,必须进行转换,因此可能会导致误差的存在。2.2浮点数的比较示例:#includeiostreamusingnamespacestd;intmain(){floatf1=7.123456789;floatf2=7.123456785;cout(f1!=f2?notsame\n:same\n);floatg=1.0/3.0;doubled=1.0/3.0;cout(g==d?same\n:notsame\n);}3.1类型转换-隐式类型转换在遇到不同类型的数据时,系统会做出适当的转换,然后进行运算。这就是隐式类型转换。隐式类型转换的条件是类型之间是相容的。例如:int和long是相容的,而浮点型和指针是不相容的。隐式类型转换总是将范围小的类型转换为范围大的类型,如char型数和int型数相加,先将char型转成int型数,然后运算。算术运算符的隐式转换方向:char-short-int-longint-float-double-longdouble3.1类型转换由于参加运算的类型可能要完成类型转换之后才能进行运算,因此从高精度转换为低精度时有可能发生精度的丢失。示例:floatf=7.0/3;//doublefloatinta=7.0/3;//doubleintcout.precision(9);coutfixed7.0/3“\n”;coutf“\n”a“\n”;结果为:2.3333333332.33333325423.2类型转换-显示类型转换显示类型转换,又称为强制类型转换。静态转换static_casttype。对被转换的表达式进行type类型的转换(类型名)(表达式)(double)a(int)(x+y)(int)6.2%4=2y的值没有改变,仍是单精度浮点型y=5.8intx;floaty=5.8;x=(int)y;x=5inti=0;doubled=3.0;i=(int)d;4.1关系与逻辑操作关系操作符==等于比较大于比较小于比较=大于等于比较=小于等于比较!=不等于比较逻辑操作符!非操作&&逻辑与||逻辑或4.2关系与逻辑运算符运算符含义返回值关系运算布尔值。若左操作数小于右操作数,则返回真关系运算布尔值。若左操作数大于右操作数,则返回真=关系运算布尔值。若左操作数不大于右操作数,则返回真=关系运算布尔值。若左操作数不小于右操作数,则返回真==等式运算布尔值。若两个操作数具有相同值,则返回真!=等式运算布尔值。若两个操作数的值不相同,则返回真!(非)逻辑运算布尔值。当操作数的值为假时,则返回真&&(与)逻辑运算布尔值。若两个操作数均非零,则返回真||(或)逻辑运算布尔值。若两个操作数任一个非零,则返回真4.2关系与逻辑运算符关系操作就是比较运算符,包括、、==等,其结果是true或false。参与逻辑操作的都是true或false的逻辑值,其结果也是true或false。逻辑与&&和逻辑或||运算符从表达式最左端开始运算,若整个表达式的值可以确定,则表达式求值过程就会结束,可能部分表达式尚未计算。这称为短路求值,如false&&true;true||false5.1位运算符运算符含义返回值左移操作左操作数的值左移右操作数包含的位数右移操作左操作数的值右移右操作数包含的位数|位或操作右操作数的每一位与左操作数的相应位逻辑或&位与操作右操作数的每一位与左操作数的相应位逻辑与^位异或右操作数的每一位与左操作数的相应位逻辑异或~位反操作将操作数的每一位取反5.2位操作位操作符包括、、&、|、^、~等操作符。左移操作””将整数最高位挤掉,而在右端补0。inta=12;//00001100a=a1;//00011000右移操作””是在整数的高位挤一个0或1进去,而整数右边的1或0挤掉(有符号数,若最高位为1,则最高位挤进1,最高位为0则挤进0;无符号数,则最高位挤进0)。inta=12;//00001100a=a1;//000001105.2位操作位与操作”&”是将两个操作数每一位做与操作。位或操作”|”是将两个操作数的每一位做或操作。位异或操作”^”是将两个操作数每一位做异或操作(都为0或都为1,其值为0,否则为1)。inta=12;//00001100;intb=6;//00000110;a=a^b;//00001010;位反操作”~”是将一个操作数每一位取反。5.2位操作位操作也有复合赋值操作,如a=5;//等价于a=a5;a=8;//等价于a=a8;a&=b;//等价于a=a&b;a|=b;//等价于a=a|b;a^=b;//等价于a=a^b;6.1增量操作操作数为左值才能做增量操作,右值或字面值不能做增量操作constintd=8;d++;//错:d不是左值。3++;//错:3不是左值。6.2增量操作增量操作分为前增量和后增量两种,即++a与a++,前增量表示先增加一,然后使用a的值,后增量表示先使用a的值,然后增加一。结合方式:自右向左,优先级最高,向右取最大。示例inta=3;intb=++a;//b为4,a为4intc=a++;//c为4,a为57运算符优先级组运算符含义优先级方向名空间域::名称空间1自左至右基本组.-()数组下标、成员调用指针调用括号222自左至右自左至右自左至右一元运算++--++--&*+-后缀自增后缀自减前缀自增前缀自减地址运算间接运算加号减号33333333自左至右自左至右自右至左自右至左自右至左自右至左自右至左自右至左7运算符优先级组运算符含义优先级方向一元运算~!sizeofnewdelete取反逻辑非数据类型大小申请内存空间释放内存空间33333自右至左自右至左自右至左自右至左自右至左间接运算.*-*间接成员调用间接指针调用44自左至右自左至右乘法运算*/%乘法除法取模555自左至右自左至右自左至右加法运算+-加法减法66自左至右自左至右7运算符优先级组运算符含义优先级方向转移运算位左移位右移77自左至右自左至右关系运算====!=小于大于小于等于大于等于等于不等于888899自左至右自左至右自左至右自左至右自左至右自左至右位运算&^|与异或或101112自左至右自左至右自左至右7运算符优先级组运算符含义优先级方向逻辑运算&&||与或1314自左至右自左至右条件运算?:条件15自右至左赋值运算=*=/=%=+=-===直接赋值相乘后赋值相除后赋值取模后赋值相加后赋值相减后赋值左移后赋值右移后赋值1616161616161616自右至左自右至左自右至左自右至左自右至左自右至左自右至左自右至左7运算符优先级一元操作符(单目操作符),赋值操作符,三元操作符都是右结合的。组运算符含义优先级方向赋值运算&=^=|=位与运算后赋值位异或运算后赋值位或运算后赋值161616自右至左自右至左自右至左异常运算trycatchthrow抛出异常抛出异常抛出异常171717自左至右自左至右自左至右逗号运算,逗号18自左至右8.1表达式的副作用-操作数求值顺序表达式求值过程中引发了多于一个实体值发生改变,称为表达式的副作用。具体值跟编译器相关。示例inta=3;intb=5;intc=a*b+++b;countcendl结果为21结果为24a*b++b+123①②③多用括号,少引起歧义8.1表达式的副作用-交换律失效交换律失效示例inta=3,b=5;c=a*b+++b;d=++b+a*b;//c与d不同//c为21,d为24或反之8.1表达式的副作用-括号失效括号失效示例inta=3,b=5;intc=++b*(a+b);//可能为54或488.2表达式的副作用2-1副作用的根源表达式中,多于一个的实体值发生改变inta=3,b=5;c=a*b+++b;//c和b改变此时,若其中一个实体被访问两次以上,则副作用可能发生,如inta,b=2
本文标题:4计算表达
链接地址:https://www.777doc.com/doc-3818254 .html