
3.1 运算符
C++包含了C语言中的运算符和表达式,并且又增加了一些新的运算符:

●∷作用域运算符。
●new动态分配内存单元运算符。
●delete删除动态分配的内存单元运算符。
●*和→*成员指针选择运算符。
C++语言中的运算符是可以让C++语言编译器能够识别的具有运算意义的符号。编译器把这些符号及其组成的表达式翻译成相应的机器代码后,就可以由计算机运行得出正确的结果。比如,日常生活当中许多东西的名字,如冰箱、电视机等分别代表不同功能的电器设备,那么运算符就是代表C++语言中的各个运算功能的名字,这些名字是由制定C++语言规范的人员确定的。
除了上述提到的一些新的运算符,C++提供的基本运算符有以下几种:算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、赋值运算符、逗号运算符、sizeof运算符及其他运算符(按功能分)。不同的运算符需要指定的操作数的个数并不相同。根据运算符需要的操作数的个数,可将其分为3种:单目运算符(一个操作数)、双目运算符(两个操作数)和三目运算符(三个操作数)。下面,介绍几种基本的C++运算符。
3.1.1 算术运算符
C++的算术运算符包含单目运算符和双目运算符,其中单目运算符有减、增量、减量运算符,双目运算符有加、减、乘、除和模运算符。C++语言支持的算术运算符符号、名称、功能及其相关示例,如表3-1所示。
表3-1 算术运算符

其中,诸如加、减、乘、除和模等双目运算符是其他程序设计语言中也都包含的,其运算方法此处就不再赘述了。这里对单目运算符做一个简单介绍,主要有减、增量、减量三种单目运算符,其功能如下。
●单目减:单目减相当于负号,即对操作数取负号。
●增量运算:增量运算有前缀增量和后缀增量两种形式。其中前缀增量的一般形式为

表示使用运算分量前其值加1。后缀增量的一般形式为

表示使用运算分量后其值加1。
●减量运算:减量运算除了将加法改为减法外,其他和增量运算完全相同。
在进行包含多个算术运算符的表达式运算时,需要注意算术运算符的优先级。针对表3-1所示的算术运算符,其优先级如下。

注意
读者要注意算术运算符的结合性,运算符的结合性是指运算符和操作数的结合方式,其有“从左到右”和“从右到左”两种。
对于优先级相同的运算符,按照其结合性进行处理;在算术运算符中,除单目运算符外,其余双目运算符的结合性都是从左到右的。
【范例3-1】算术运算符的使用。该范例中a=5,b=3,c=1,d=2,e=6,求表达式a+b-c/d+e%d的值,实现代码如代码清单3-1所示。
代码清单3-1

【运行结果】与前面章节提到的一样,经过编译连接该源程序没有错误后,使用菜单【Build】/【Execute】或快捷键【Ctrl+F5】运行,其结果如图3-1所示。

图3-1 算术运算运行结果
【范例解析】根据算术运算符的优先级和结合性,可以计算得出a+b-c/d+e%d=5+3-0+0=8。上述程序代码res=a+b-c/d+e%d将验证这一运算结果。在计算该表达式时,读者需要注意运算符的优先级,即乘法、除法和取模先进行运算,加法和减法后运算。
3.1.2 赋值运算符
赋值运算符是C++程序设计中最基本的运算符之一,利用赋值运算符可以给一个变量赋值。其说明语句的一般形式为:


其中,各部分的作用如下:
●表达式的类型需与变量的类型一致。
●“=”为赋值运算符,其不同于数学上的等号。赋值运算的运算规则是先计算右边表达式的值,然后将值赋给左边的变量。
例如,代码清单3-1中的语句“a=5”或其他赋值语句,其中的“=”均为赋值运算符,而不是数学中的等号。此外,在程序中经常出现类似于s=s+n这样的赋值语句,C++允许采用更为简洁的形式写为“s+=n”,于是形成了复合赋值运算符。根据C++中算术运算符和比较运算符的种类,复合赋值运算符一共有10种,如表3-2所示。
表3-2 复合赋值运算符

说明
在赋值运算符中,复合赋值运算符和赋值运算符的优先级是相同的。赋值运算符的优先级仅高于逗号运算符。另外,赋值运算符的结合性是从右到左的。
【范例3-2】赋值运算符的使用。下列程序代码实现求自然数1~100的算术和。在该示例中,使用到了赋值运算符和复合赋值运算符,实现代码如代码清单3-2所示。
代码清单3-2

【运行结果】编译连接上述源程序无误后,执行结果如图3-2所示。

图3-2 求自然数1~100和运算结果
【范例解析】范例3-2代码中使用了循环控制结构for语句,这将在第4章中详细讲解。此外,代码中使用了复合赋值运算符“+=”,并且语句“sum+=i;”相当于“sum=sum+i;”,即将变量sum本身加上变量i的值后将结果再赋值给sum。
提示
复合赋值运算符在实际程序中使用较多,其可以使得C++语句更为精练、简单,读者应注意语句中变量值的变化。
3.1.3 关系运算符
关系运算符是双目运算符,其作用是将两个运算分量进行大小比较,其运算结果类型为布尔数据类型。若关系成立,则值为true,否则为false。C++中,支持的关系运算符主要有6种,其运算符号、名称、功能,以及各运算符的相关示例,如表3-3所示。
表3-3 关系运算符

上表中的前4种即<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)优先级相同,它们的优先级高于==(等于)和!=(不等于)。此外,关系运算符的优先级低于算术运算符,其结合性是从左到右的。例如,下列语句中就包含了关系运算符,根据其关系成立与否,其返回值也不同。

3.1.4 逻辑运算符
C++提供了三种逻辑运算符,单目运算符有逻辑非(!)、双目运算符有逻辑与(&&)和逻辑或(||)。其运算结果类型为布尔型数据类型,其值为true或false。这三种运算符号、名称、功能及其相关示例,如表3-4所示。
表3-4 逻辑运算符

提示
表3-4中的!(逻辑非)、&&(逻辑与)、||(逻辑或)优先级依次从高到低。!(逻辑非)的优先级比算术运算符和关系运算符高,而&&(逻辑与)、||(逻辑或)的优先级低于关系运算符。此外,逻辑运算符的结合性是从左到右的。
例如,下列语句包含了逻辑运算符及其相关计算。

3.1.5 条件运算符
在C++中,还支持条件运算符的使用,条件运算符是一个比较特殊的运算符,是三目运算符,说明语句的一般形式为:

该表达式的使用规则如下。
●表达式1必须是布尔类型。
●表达式的执行顺序是:先求解表达式1;若表达式1的值为true,则求解表达式2,表达式2的值为最终结果;若表达式1的值为false,则求解表达式3,表达式3的值为最终结果。
●条件运算符优先级高于赋值运算符,低于逻辑运算符;其结合性为从右到左。
例如,读者可以通过如下的表达式理解条件运算符的使用。

上述表达式的含义为:如果a>b成立,那么将a的值赋给x;如果a>b不成立,则将b的值赋给x。这在实际程序中的应用是比较多的。
【范例3-3】条件运算符的使用。下列代码清单3-3根据用户输入的两个数值,比较其值,并输出其中大的数值,实现代码如代码清单3-3所示。
代码清单3-3

【运行结果】编译连接上述源程序无误后,其执行结果如图3-3所示。

图3-3 条件运算符执行结果
【范例解析】范例3-3程序代码中,使用了简单的输入/输出语句“cin”和“cout”,并使用条件运算符取得大的数值输出。其中,变量x的值根据a和b的大小来决定,如果a>b,则x的值为a,否则x的值为b。
提示
事实上,读者在学习完后续章节中的控制语句流程内容后,可以发现,条件运算符其实相当于条件语句中的“if…else”语句结构。
例如,上述示例中的条件语句:x=a>b?a:b可以通过“if…else”语句改写如下:

3.1.6 逗号运算符
C++还支持逗号运算符的使用。逗号运算符可以使多个表达式写在一行上,从而大大地简化了程序,其一般形式为:

该表达式的使用规则如下。
●表达式的执行顺序是:先求解表达式1,再求解表达式2,其最终结果为表达式2的值。
●逗号运算符是优先级最低的运算符,其结合性为从左到右的。
例如,下列是一条采用了逗号运算符的语句:

上述语句的结果为10,这是因为逗号表达式的最终结果为后面的表达式值,而根据逗号表达式的求解顺序,其输出结果为2×5=10。
3.1.7 位运算符
C++中除了提供对表达式的运算符外,还提供了对数据进行位运算的功能。C++中包含了支持数据位运算的6种位运算符,如表3-5所示。
表3-5 位运算符

在表3-5中,左移运算(<<)指左移后,低位补0,高位舍弃。右移运算(>>)指右移后,低位舍弃,高位无符号数补0,有符号数补符号位。例如,下列语句对两个变量进行位运算,输出结果。

注意
位运算符的优先级低于算术运算符,高于逻辑运算符&&(逻辑与)、||(逻辑或)。位运算符的结合性除单目运算符按位取反是从右到左,其余双目位运算符都为从左到右。
3.1.8 sizeof运算符
由于不同的计算机支持的数据类型长度是不一样的,因此需要一个运算符来测量该机器中的数据类型长度。C++提供的sizeof运算符,就是用于测量类型长度的运算符。一般来说,该运算符的使用格式为:

该预算符的运算结果是类型名所表示类型的长度或表达式的值所占用的字节数,即这个值所属类型的长度。例如:

3.1.9 运算符的优先级
在3.1节介绍运算符时,简要介绍了运算符的优先级,本节将着重介绍C++中各种运算符之间及同一种类运算符的优先级顺序。
运算符优先级决定了在表达式中各个运算符执行的先后顺序。同一优先级的优先级别相同,运算次序由结合方向决定,使用括号可以改变运算符的顺序。例如表达式1*2/3,*和/的优先级别相同,其结合方向自左向右,则该表达式等价于(1*2)/3。在C++中,运算符的优先级一般分为15级,其优先级中包含的运算符、功能说明和同一优先级的运算符结合性,具体如表3-6所示。
表3-6 运算符优先级

提示
此外,读者对运算符的结合方式也需有一些了解。运算符的结合方式是指优先级相同的运算符,其运算顺序由结合方式来决定。一般来说,运算符的结合方式有两种:左结合和右结合。大多数运算符都是从左到右计算,只有三类运算符的结合性是从右到左的,分别是单目运算符、三目运算符和赋值运算符。