2.5 运算符和表达式
C++语言的运算符和表达式数量之多,在其他高级语言中是少见的。正是丰富的运算符和表达式使C++语言功能十分完善。这也是C++语言的主要特点之一。
C++语言的运算符不仅具有不同的优先级,而且还有一个特点,就是其结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其他高级语言的运算符所没有的,因此也增大了C++语言的复杂性。
2.5.1 运算符及表达式简介
运算是对数据的加工和处理。最基本的运算形式通常可以用一些简洁的符号来描述,这些符号称为运算符。被运算的对象,即数据,称为运算量。由运算符和运算量组成的表达式描述了对哪些数据、以何种顺序、进行什么样的运算。运算量可以是常量、变量或函数。表达式是语句的重要组成部分,可以用来为变量赋值,也可以作为参数来调用函数。
1. 运算符的种类
C++语言提供了丰富的运算符,可以构成多种表达式。
(1) 算术运算符
用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共7种。
(2) 赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=、-=、*=、/=、%=)和复合位运算赋值(&=、|=、^=、>>=、<<=)3类共11种。
(3) 逗号运算符
用于把若干表达式组合成一个表达式(,)。
(4) 关系运算符
用于比较运算的运算符,有6种,包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)。
(5) 逻辑运算符
用于逻辑运算的运算符,有3种,包括与(&&)、或(||)、非(!)。
(6) 条件运算符
这是一个三目运算符,用于条件求值( :)。
(7) 指针运算符
有两种,即:用于取内容(*)和取地址(&)的运算符。
(8) 求字节数运算符
用于计算数据类型所占的字节数(sizeof())。
(9) 特殊运算符
有函数调用(())、强制类型转换(())、下标([]),成员(→,.)等几种特殊运算符。
(10) 位操作运算符
参与运算的量,按二进制位进行运算,有6种,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)。
2. 运算符的优先级与结合性
(1) 运算符的优先级
当在一个算术表达式中出现多个运算符时,要按照运算符的优先次序进行运算,优先级高的运算符先运算,优先级低的运算符后运算。在表达式中,优先级较高的先于优先级较低的进行运算。在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
(2) 运算符的结合性
在C++语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。C++语言运算符有不少为右结合性,应注意区别,以避免理解错误。
一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
3. 表达式
表达式是由运算符组建常量、变量、函数所组成的有意义的式子,单个常量、变量或函数也可以看成是特殊的表达式。每个表达式都有一个值和类型,表达式最终计算结果称为表达式的值,表达式的值的数据类型即为表达式的类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。