运算符用来给出计算的类型,参与运算的数据称为操作数。C++中的运算符分为算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符和其他运算符等。
C++语言提供了丰富的运算符,在使用运算符时,要注意以下几点。
(1)运算符对操作数的要求。例如:取余运算符%要求参与运算的两个数必须是整型。
(2)运算符的优先级。每个运算符都有优先级,用来决定在表达式中的运算次序。表达式要按照优先级从高到低的顺序进行运算。
(3)对于优先级相同的运算符,运算顺序要按运算符的结合性来确定是自左向右还是自右向左。例如:5∗6/7,要按左结合性就是先算乘法,要按右结合性就是先算除法。
C++中常用运算符的功能、优先级和结合性如表2-4所列。
表2-4 C++语言中运算符的功能、优先级和结合性
续表
C++程序中的表达式是由运算符和操作数构成的,表达式的运算结果叫作表达式的值。在书写表达式时,一定要注意运算符的优先级与结合性,确保表达式的实际运算次序与用户所要求的一致,从而保证运算结果的正确性。必要时可以使用()来改变优先级,圆括号嵌套使用时,先计算内括号的值。
C++语言中的表达式包括算术表达式、关系表达式、条件表达式、赋值表达式、逗号表达式等。
1.算术运算符和算术表达式
C++中的算术运算符包括基本算术运算符和自增、自减运算符。
1)基本算术运算符和表达式
基本算术运算符有:+(正或加号)、-(负或减号)、∗、/、%(取余)。其中,取正、取负是单目运算符,其余为双目运算符。
加法、减法的优先级相同,乘法、除法、取余的优先级相同。
/:当两个操作数都是整数时,其结果是所得商的整数部分。例如:5/2的结果是2。当两个操作数有一个不是整数时,其结果也不是整数。例如:5/2.0的结果是2.5。
%:可以求得两数相除后的余数。例如:11%2=1,-16%5=-1。
注意:%运算结果的符号总是和被除数相同。例如:15%-6=3。
2)自增、自减运算符和表达式。
自增、自减运算符都是单目运算符,它们都有前置和后置两种形式。前置是指运算符在变量的前面,后置是指运算符在变量的后面。例如:
前置形式是先计算变量的值(增1或减1),然后用变量的值作为表达式结果参与运算,即先计算变量再使用变量。后置形式是先将变量的值作为表达式结果参与运算,然后再计算变量的值(增1或减1),即先使用变量再计算变量。
无论是前置还是后置形式,当两个运算符单独使用时,都只是使变量的值增1或减1。例如:假设x=8,分别计算下面两个表达式的结果。
执行两个表达式后,x的值都变为9,但y的值却不一样。第一个表达式y的值变为9,因为x要先加1再赋给y。第二个表达式y的值仍为8,因为x要先赋给y再加1。说明:
(1)自增、自减运算符只能用于变量,不能用于常量和表达式。结合方向是自右向左。例如:表达式-k++的运算顺序可以理解为-(k++)。
(2)自增、自减运算符都很容易出错,使用时要特别注意。例如:
运行结果:
大多数编译系统都是按照自右向左的顺序输出各项的。
在进行算术运算时,要注意溢出问题,因为基本数据类型都有一定的取值范围。对于浮点型数据,在运算结果超出范围时,程序将异常中止,但C++语言并不认为溢出是一个错误。另外,除数为零时,程序也会异常中止。
2.关系运算符与关系表达式
1)关系运算符
关系运算符用于比较两个数的大小,其结果是一个布尔值,true(真)或false(假)。在C++语言中,关系运算符都是双目运算符,共有6个,分别是:<、>、<=、>=、==(等于)、!=(不等于)。其中,前四个优先级高于后两个。
说明:
(1)关系运算的结果也可以是整数,1等价于true,0等价于false。例如,6<5的结果为0。
(2)不要把运算符“==”误用为赋值运算符“=”。例如,判断变量x的值是否等于2,应该写成x==2,不要写成x=2,那样结果永远为真。
(3)数学上的5≤x≤20,在C++中要写成5<=x&&x<=20,不能写成5<=x<=20。
2)关系表达式
关系表达式由关系运算符和操作数组成,表达式的值为1(true)或0(false)。关系表达式经常出现在条件语句或循环语句中,用于决定条件是否满足,或是否继续循环。
例2-4 关系表达式的计算。
程序执行结果如下:(www.xing528.com)
3.赋值运算符和赋值表达式
C++中的赋值运算符分为两种:简单赋值运算符和复合赋值运算符。
1)简单赋值运算符
简单赋值运算符为“=”,其表达式的一般形式为:
变量=表达式
执行时,先计算表达式的值,然后赋给左边的变量。如果两边的类型不一致,系统会自动进行类型转换。
2)复合赋值运算符
复合赋值运算符是由一个数值型运算符和基本赋值运算符组成,共有10个,分别为+=、-=、∗=、/=、%=、<=、>=、&=、^=、 |=。其表达式的一般形式为:
变量复合赋值运算符 表达式
执行时,先用左边变量和右边表达式做数值运算,然后将运算结果赋给左边变量。例如:
使用复合赋值运算符,不仅书写简单,而且经过编译以后生成的代码少。
3)赋值表达式
赋值表达式由赋值运算符和操作数组成。其作用是把赋值运算符右边表达式的值赋给左边的变量。例如:
4.位运算符
位运算符共6个,分别为:~(按位求反)、&(按位与)、 | (按位或)、^(按位异或)、<<(左移位)、>>(右移位)。其中,“~”为单目运算符。
位运算符用来对二进制整数进行逐位运算。因应用较少,不再详述。
5.其他运算符
1)条件运算符
条件运算符“?:”是一个三目运算符,一般形式为:
表达式1?表达式2:表达式3
执行时,先分析表达式1,当其值为真时,则整个条件表达式的结果即为表达式2的值,否则为表达式3的值。条件运算符的优先级低于算术运算符、关系运算符和逻辑运算符,但高于赋值运算符,结合性为从右到左。
例如:求x和y中较大者,并将其存入变量max中,可以写成:
2)逗号运算符
由逗号运算符“,”构成的表达式称为逗号表达式,一般形式为:表达式1,表达式2,…,表达式n
逗号表达式的执行顺序是从左到右,逐个执行,最后一个表达式的值为整个逗号表达式的结果。逗号运算符的优先级最低。
例如:表达式a=1,a+2,a∗3的结果为3。这里a=2并没有改变a的值。
6.表达式中数据类型的转换
表达式的值和类型,由运算符和参与运算的操作数决定。当各操作数的类型相同时,表达式的类型就是操作数的类型。但是,当参与运算的操作数类型不同时,就需要对不同类型的操作数进行类型转换。转换的方法有两种:隐式转换和强制转换。
1)隐式转换
当操作数类型不同时,系统将自动转换成类型最高的操作数类型。
整个类型转换的方向表示如下:
可以看出,隐式转换是由取值范围小的类型,向取值范围大的类型转换,以确保在转换过程中,不会降低计算精度和造成数据丢失。隐式转换是编译系统自动完成的,它并不改变操作数的类型,只是在计算表达式的值时,临时改变操作数的数据类型。计算完成后,操作数仍保持原有的数据类型。
2)强制转换
强制转换是将表达式的类型,强制转换成指定的数据类型,其一般形式为:
数据类型(表达式)
或
(数据类型)表达式
例如:
如果利用强制类型转换,将高类型转换成低类型,会造成数据精度的损失。C++虽然允许不同类型的数据混合运算,但带来了很多副作用,所以尽量使用同类型的数值进行运算。
在类型转换中,赋值表达式比较特殊。它是将右边操作数据的类型,转换成左边操作数据的类型,并用转换后的值给左边赋值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。