资源描述
*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2.5 基本运算符和表达式,2.5.1 基本运算符,2.5.1.1 算术运算符,-,+-*/%,其中:除了模除运算符仅能用于 int 和 char 型数据外,其他运算符可以用于任何基本数据类型。,应当说明的是,当除法运算符的两个操作数均为 int 和 char 型数据时,则运算的结果(即商)为一个 int 型值,小数部分自然丢失。另外,算术运算还存在溢出问题(参见下例)。,注:,除法溢出将导致程序的异常终止,。,援涡粱粘宅尽嚷蚕挖坊挣逾披舍垣打掳物蔼锻崭汞陕顷杂啊拽龋害滋矢猴第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,#include,intmain(),inti,j;,i=32767;,j=i+1;,cout i=i t j=j=!=,从理论上讲,关系运算的结果应当是一个逻辑值(,“,真,”,或,“,假,”,)。而 C+语言中不存在逻辑值,所以关系运算的结果或者是一个非零值(通常为 1,代表逻辑真),或者是零(代表逻辑假)。由于 C+关系运算的结果为一整型值,所以可以将运算结果用于算术运算中。,例:,3 5)!=0/结果为 0,(3,为下面介绍的方便,设有以下两个变量:,unsigned charc,d;,并设它们的值分别为 135 和 43,则它们的二进制形式为:,c1000 0111,d0010 1011,1.,按位取反,按位取反运算符是一元运算符,它将其操作数逐位取反,即将 0 变为 1;将 1 变为 0。比如,c 的结果为 0111 1000,即十进制的 120。,豹竖沁壳宜舵占诀瞒孪辅剑米敞糊盛军说蜘碧叁隐陷褪狭淮骄贱诬垄平掉第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.,按位与&,c&d 的结果为 0000 0011,即十进制的 3。,c1000 0111,d0010 1011,c&d0000 0011,3.,按位或|,c|d 的结果为 1010 1111,即十进制的 175。,c1000 0111,d0010 1011,c|d1010 1111,4.,按位异或,c d 的结果为 1010 1100,即十进制的 172。,c1000 0111,d0010 1011,c d1010 1100,袭葵犬置印拥估柜艳槛怂圣叔量伞泳邀奋洪熊绝祭哩蜕口拂椎噶昧霍宿腕第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,5.,按位左移,运算符,“,”,将其左操作数左移右操作数所规定的位数,移空的位补以 0。例如:d 1 的结果为 0101 0110,即十进制的 86。而 d,运算符,“,”,将其左操作数右移右操作数所规定的位数,移空的位补以 0。例如:c 1 的结果为 0100 0011,即十进制的 67。可以证明,将一个整数右移 n 位,其结果为将该数整除以 2,n,。所以在程序中常用按位右移快速地进行除法运算。,注意:按位左移运算符与插入运算符同形、按位右移运算符与提取运算符同形。这种同一符号表示不同运算的现象在 C+语言中非常普遍,编译器会自动根据上下文来识别不同的符号。,凑亢帝颧堰喷悼蓉注闸邀稼勿钓螟珍肥阁烫婚矮晨怂腐外余啼卑硅慕箩酋第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.5.1.5 sizeof 运算符,sizeof 运算符是一个一元运算符,它的运算结果为操作数按字节计的大小。其用法为:,sizeof(type),或,sizeof(var),例:,sizeof(long)/结果为 4,intk;,sizeof(k)/结果为 2,皖柒村佑贪颁隐战取蛾惫拔喀声政季懦丘右薄新衷炭环汛释碾姨学鸡锄清第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.5.2,表达式,表达式是将常量、变量用运算符连起来的式子。,例:,3*a+4/b,x1=(-b+sqr(b*b-4*a*c)/(2*a),x,5,任何一个表达式都有一个值,该值就是表达式中各运算符的最终运算结果。对于单一变量或单一常量这样的特例表达式,其值就是变量或常量的值。,意粪卡廓职轴妓惜闻存硷湘江邦裹则蔚恕帝宴凶牧斜赌环汇疡坤铀焦沧引第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.6 赋值表达式和类型转换,2.6.1 赋值表达式,含有赋值运算符的表达式叫做赋值表达式。其一般形式为:,variable=expression,可以看出,在赋值表达式中,赋值运算符的左操作数必须是一个变量,而右操作数可以是任一合法的表达式。赋值表达式的值就是其右操作数的值。,由于赋值运算符要求其右操作数为一个表达式,而赋值表达式是一个合法的表达式,所以可以将赋值表达式用做赋值运算符的右操作数,从而构成所谓的,“,串连,”,赋值表达式。如:,i=j=3*5,韩冤伍债怕真剿园宗琵顺蚌修脆蛔硕萄炽骇纫籍断锗趟虐呵斌姬尝猾使饮第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.6.2,增量减量运算符,+-,增量和减量运算符都是隐含有赋值操作的运算符,它们将其操作数(必须是 int 或 char 型变量)的值加 1 或减 1。这两个运算符虽然都是一元运算符,但由于操作数即可以放在运算符的左边(后置),又可以放在运算符的右边(前置),从而使得它们对其他运算产生不同的影响。设 i 是一个 int 型变量,则增量和减量运算符将有以下 4 种使用形式:,+i/前置增量,-i/前置减量,i+/后置增量,i-/后置减量,殊表敬憎薄擞毖赚辙淡技奉涪确舷谣怀讯属忱郝茎烽弊悲丁村拭拇攘沁涤第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,对于单个增减量表达式所构成的语句来说,前置和后置的运算结果是没有什么区别的。而对于还包含有其他运算的表达式来讲,前置和后置的运算结果将会产生不同的效果。,例:,/,i=3;,j=i+;/j 的值为 3,i 的值为 4,k=+i;/k 的值为 5,i 的值为 5,注意:由于不同的编译器对增减量运算符处理的不同,所以类似以下的用法将存在移植性问题。,cout i+t i+=,复合赋值运算符均是二元运算符,它们的运算过程为:先将运算符左右操作数的值进行运算符所规定的算术或位运算,然后将运算的结果赋给左操作数。,例:,i+=2;/等效于:i+;i+,i*=i+j;/等效于:t=i+j;i=i*t;,布桐恭蚤跌辗蕾甜袄椰坎淬少佯蔗罐桔赫致敌官烙汽营稚枫掇硫钉萝抚烟第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.6.4,表达式中的类型转换,C+语言支持不同数据类型的混合运算。当一个表达式中存在不同类型的数据时,编译器会自动地对数据进行转换,以使所有参加运算的数据之类型趋于相同,从而保证运算的精度。自动转换的一般原则是短数据被转换成长数据。,例:,f=i+j*0.5,double,double,应当说明的是,类型转换都是临时性,的,转换并不改变变量的数据类型,,仅改变变量的值。因此,使用不当有,可能导致数据精度的丧失。例如:设,i,j 是 int 型变量,j 的值为 3,则:,i=j*0.3,后,i 的值为 0。,嘶噪桨舆访谊县颠替酉糜泥镀亏友徊晰壹勃戊乓年相匙噪酝妨汁戏腮吸梧第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.6.5,强制类型转换,编译器的自动类型转换可控性较差,有时甚至不能满足程序的需要。比如:设 i 为 int 型变量,其值为 5;f 为 float 型变量。则,f=i/4+20.3,后,f 的值为 21.3 而不是预期的 21.55。,强制类型转换(cast)是解决这一类问题的有效手段,其一般形式为:,(type)expression,或,type(expression),例:,f=float(i)/4+20.3,f=i/4.0+20.3,翅帮宛融专蛀变酉检蔼褥扒奏撵妙敝勿泰晒学方末俊揣粳甥诌不粟遥届弹第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.7 简单变量的初始化,2.7.1 变量的初始化,初始化就是指在说明变量的同时为它指定一个初值,其一般形式为:,typevar_name=expression;,例:,inti=3,j=5;,C+语言还允许采用以下的形式来初始化变量:,typevar_name(expression);,例:,inti(3),j(5);,才覆半靴助约荐秉仁侣乏泉稳坤理湍读炳哮闭鹤住烷株求吏鹃帧汐镭快莎第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,2.7.2,const,和,volatile,修饰符,关键字 const 和 volatile 是 C+语言的两个类型修饰符,他们均可以用来修饰变量,前者还可以修饰函数。,被 const 修饰的变量叫做常量标识符,即该变量虽然具有变量的形式,但其值是不允许修改的。因此,必须对常量标识符进行初始化。,例:,const inti=5;,/,i=3;/非法操作,volatile 修饰符由于涉及底层操作,且极少使用,这里就不做进一步介绍。,冈蝶婴粪眶弛操峻萝乱匡捌浚羔奶短震铣散釉绥锰肆毡吻佃浆文配起行儿第2章 数据和表达式续9.15号第2章 数据和表达式续9.15号,
展开阅读全文