这一讲主要讲运算符和表达式。运算符,顾名思义,就是用于计算的符号,比如+,-,*,/。表达式是用于计算的公式,由运算符、运算量(操作数)和括号组成。

      有些运算符需要两个操作数,形式为:操作数 运算符 操作数,这样的运算符就叫做二元运算符或双目运算符,只需要一个操作数的运算符叫做一元运算符或单目运算符。运算符具有优先级和结合性。

      1.算术运算符和算术表达式

      算术运算符包括基本算术运算符和自增自减运算符。由算术运算符、操作数和括号组成的表达式称为算术表达式。基本算术运算符有:+,-,*,/,%。其中"-"作为负号时为一元运算符,作为减号时为二元运算符。优先级跟我们数学里的是一样的。"%"是求余运算,它的操作数必须是整数,比如a%b是要计算a除以b后的余数,它的优先级与"/"相同,这里要注意的是,"/"用于两个整数相除时,结果含有小数的话小数部分会舍掉,比如2/3的结果是0。

       2.赋值运算符和赋值表达式

      最简单的赋值运算符就是"=",带有赋值运算符的表达式被称为赋值表达式。赋值表达式的类型是等号左边对象的类型,它的结果值也是等号左边对象被赋值后的值,赋值运算符的结合性是自右向左。即:a=b=c=1这个表达式会先从右边算起,即先算c=1,c的值变为1这个表达式的值也是1,然后这个表达式就变成了a=b=1,再计算b=1,同样b也变为1,b=1这个表达式的值也变成1,所以a也就变成了1。

       除了"="外,赋值运算符还有+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。其中前五个是赋值运算符和算术运算符组成的,后五个是赋值运算符和位运算符组成的,这几个赋值运算符的优先级跟"="相同,结合性也是自右向左。

       3.逗号运算符和逗号表达式

       逗号也是一个运算符,它的使用形式为:表达式1,表达式2。求这个表达式的值就要先解表达式1,然后解表达式2,最终这个逗号表达式的值是表达式2的值。比如计算a=1*2,a+3,应先计算a=1*2,结果为2,再计算a+3的值,a的值已经变成了2,再加上3为5,这个逗号表达式的最终结果就是5。

       4.逻辑运算和逻辑表达式

       C++中提供了用于比较的关系运算符和用于逻辑分析的逻辑运算符。

       关系运算符包括<、<=、>、>=、==、!=。前四个的优先级相同,后两个相同,而且前四个比后两个的优先级高。用关系运算符把两个表达式连起来就是关系表达式,关系表达式的结果类型为bool,值只能是true或false。比如,a>b,a大于b时表达式a>b表达式的值是true,否则就是false。更复杂的表达式也算是一个道理。

       逻辑运算符包括!(非)、&&、||,优先级依次降低。逻辑表达式的结果也是bool类型,值也只能是true或false。"!"是一元运算符,使用形式是!操作数。非运算是对操作数取反。比如!a,a的值是true,则!a的值是false。

       5.条件运算符和条件表达式

       C++中唯一一个三元运算符是条件运算符"?"。条件表达式的使用形式是:表达式1?表达式2:表达式3。表达式1是bool类型的,表达式2,3可以是任何类型,并且类型可以不同。如:(a<b)?a:b,如果a小于b,则结果为a,如果a大于b,则结果为b。

       6.sizeof运算符

       sizeof运算符用来计算某个对象在内存中占用的字节数。此运算符的使用形式为:sizeof(类型名)sizeof(表达式)。计算结果是这个类型或者这个表达式结果在内存中占的字节数。

       7.位运算

      (1)按位与(&)。它是对两个操作数的二进制形式的每一位分别进行逻辑与操作。比如3的二进制形式为00000011,5的二进制形式为00000101,按位与后结果是00000001。

      (2)按位或(|)。它对两个操作数的二进制形式的每一位分别进行逻辑或操作。还是比如3和5按位或运算后结果是00000111。

      (3)按位异或(^)。它对两个操作数的每一位进行异或,也就是如果对应位相同则运算结果为0,若对应位不同则计算结果为1。例如3和5按位异或后结果为00000110。

      (4)按位取反(~)。即对一个二进制数的每一位求反。

      (5)移位。包括左移运算(<<)和右移运算(>>),都是二元运算符。移位运算符左边的数是需要移位的数值,右边的数是移动的位数。左移是按指定的位数将一个数的二进制值向左移位,左移后,低位补0,移出的高位舍弃。右移是按照指定的位数将一个数的二进制值向右移位,右移后,移出的低位舍弃,如果是无符号数则高位补0,如果是有符号数,则高位补符号位或0,一般补符号位。比如,char型变量的值是-8,则它在内存中的二进制补码值是11111000,所以a>>2则需要将最右边两个0移出,最左边补两个1,因为符号位是1,则结果为11111110,对其再求补码就得到最终结果-2。

        8.混合运算时数据类型的转换。

       表达式中的类型转换分为:隐含转换强制转换

       在算术运算和关系运算中如果参与运算的操作数类型不一样,则系统会对其进行类型转换,这是隐含转换,转换的原则就是将低类型的数据转换为高类型数据。各类型从低到高依次为char,short,int,unsigned int,long,unsigned long,float,double。类型越高范围越大,精度也越高。隐含转换是安全的,因为没有精度损失逻辑运算符的操作数必须是bool型,如果不是就需要将其转换为bool型,非0数据转换为true,0转换为false。位运算操作数必须是整数,如果不是也会自动进行类型转换,也是低类型数据转换为高类型数据。赋值运算要求赋值运算符左边的值和右边的值类型相同,不同的话也要进行自动转换,但这个时候不会遵从上面的原则而是一律将右值转换为左值的类型。

比如,int iVal; float fVal; double dVal;则dVal=iVal*fVal;计算时先将iVal转换为跟fVal一样的float型,乘法的结果再转换为double型。

       强制类型转换是由类型说明符和括号来实现的,使用形式为:类型说明符(表达式)  或   (类型说明符)表达式。它是将表达式的结果类型强制转换为类型说明符指定的类型。比如,float fVal=1.2;  int iVal = (int)fVal;计算后面表达式的值时会将1.2强制转换成1,舍弃小数部分。



http://www.jizhuomi.com/software/32.html