C++的运算符

C++的运算符十分丰富,使得C++的运算十分灵活方便。例如把赋值号( =)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符。

  1. 算术运算符

+ (加) - (减) * (乘) / (除) % (整除求余) ++ (自加) – (自减)

  1. 关系运算符

> (大于) < (小于) == (等于) >= (大于或等于) <= (小于或等于)

  1. 逻辑运算符

&& (逻辑与) || (逻辑或) ! (逻辑非)

  1. 位运算符

<< (按位左移) >> (按位右移) & (按位与) | ( 按位或) /\ (按位异或) ~ (按位取反)

  1. 赋值运算符( = 及其扩展赋值运算符)

  2. 条件运算符( ? : )

  3. 逗号运算符( , )

  4. 指针运算符( * )

  5. 引用运算符和地址运算符( & )

  6. 求字节数运算符( sizeof )

  7. 强制类型转换运算符( (类型) 或 类型 ( ) )

  8. 成员运算符( . )

  9. 指向成员的运算符( -> )

  10. 下标运算符( [ ] )

  11. 其他( 如函数调用运算符( ) )


算术运算符与算术表达式

基本的算术运算符

+ (加法运算符,或正值运算符。如 3+5,+3)

- (减法运算符,或负值运算符。如 5-2,-3)

* (乘法运算符。如3*5)

/ (除法运算符。如5/3)

% (模运算符,或称求余运算符, %两侧均应为整型数据,如7%4的值为3)

注意,两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍人的方向是不固定的。

如果参与+ ,- ,* ,/ 运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理

算术表达式和算术运算符的优先级与结合性

用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C++语法规则的式子,称为C++算术表达式。运算对象包括常量、变量、函数等。例如,下面是一个合法的C++算术表达式:

a*b/c-1.5+a

C++语言规定了运算符的优先级和结合性。在求解表达式时,先按运算符的优先级别高低次序执行,例如先乘除后加减。如有表达式a—b*c,b的左侧为减号,右侧为乘号,而乘号优先于减号,因此,相当于a—(b*c)。如果在一个运算对象两侧的运算符的优先级别相同,如a—b+c,则按规定的“结合方向”处理。
C++规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,即先左后右,因此b先与减号结合,执行a—b的运算,再执行加c的运算。“自左至右的结合方向”又称“左结合性”,即运算对象先与左面的运算符结合。

表达式中各类数值型数据间的混合运算

在表达式中常遇到不同类型数据之间进行运算,如

10+’a’+1.5-8765.1234*b’

在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如下图所示:

优先级

图中横向向左的箭头表示必定的转换,如char和short型数据必先转换为int型,float型数据在运算时一律先转换成double型(即使是两个float型数据相加,也都先转换成 double型,然后再相加)。

纵向的箭头表示当运算对象为不同类型时转换的方向。例如int型与double型数据进行运算,先将int型的数据转换成double型,然后在两个同类型(double型)数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为int型先转换成unsignedint型,再转成long型,再转成double型。如果一个int型数据与一个double型数据运算,是直接将 int 型转成 double 型。同理,一个 int 型与一个 long 型数据运算,则先将 int 型转换成 long 型。
换言之,如果有一个数据是float型或double型,则另一数据要先转换为double型,运算结果为double型。如果参加运算的两个数据中最高级别为long型,则另一数据先转换为long型,运算结果为long型。其他依此类推。

假设已指定i为整型变量,f为float变量,d为double型变量,e为long型,有下面表达式:

10+’a’+i*f-d/e

运算次序为:①进行10+’a’的运算,先将’a’转换成整数97,运算结果为107。②进行i*f的运算。先将i与f都转换成double型,运算结果为double型。③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000——00),结果为double型。④将变量e转换成double型,d/e结果为double型。⑤将10+’a’+i*f的结 果与d/e的商相减,结果为double型。

上述的类型转换是由系统自动进行的。

自增(++)和自减(–)运算符

在C和C++中,常在表达式中使用自增(++)和自减(–)运算符,它们的作用是使变量的值增1或减1,如:
++i(在使用i之前,先使i的值加1,如果i的原值为3,则执行j=++i后,j的值为4)

–i(在使用i之前,先使i的值减1,如果i的原值为3,则执行j=–i后,j的值为2)

i++(在使用i之后,i的值加1,如果i的原值为3,则执行j=i++后,j的值为3,然后i变为4)
i–(在使用i之后,使i的值减1,如果i的原值为3,则执行j=i–后,j的值为3,然后i变为2)
粗略地看,++i和i++的作用相当于i=i+1,但++i和i++不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。如

i=3;

cout << ++i ;

输出4。 如果改为

cout << i++ ;

则输出3。

正确地使用++和–,可以使程序简洁、清晰、高效。

自增(减)运算符在C++程序中是经常见到的,常用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下一个地址。这些将在以后的章节中介绍。

强制类型转换运算符

在表达式中不同类型的数据会自动地转换类型,以进行运算。有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需类型。例如,

语法 效果
(double)a 将a转换成double类型
(int)(x+y) 将x+y的值转换成整型
(float)(5%3) 将5%3的值转换成float型

强制类型转换的一般形式为

类型名)(表达式

注意:如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来。如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式应该用括号括起来。如果写成

(int)x+y

则只将x转换成整型,然后与y相加。

以上强制类型转换的形式是原来C语言使用的形式,C++把它保留了下来,以利于兼容。C++还增加了以下形式:

类型名表达式

int(x)或 int(x+y)

类型名不加括号,而变量或表达式用括号括起来。这种形式类似于函数调用。但许多人仍习惯于用第一种形式,把类型名包在括号内,这样比较清楚。

需要说明的是在强制类型转换时,得到一个所需类型的中间数据,但原来变量的类型未发生变化。例如,

(int)x

如果x原指定为float型,值为3.6,进行强制类型运算后得到一个int型的中间数据,它的值等于3,而x原来的类型和值都不变。

例:强制类型转换

编写程序:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
float x;
int i;
x=3.6;
i=(int)x;
cout<<"x="<<x<<",i="<<i<<endl;
return 0;
}

运行结果:

x=3.6,i=3

x的类型仍为float型,值仍等于3.6。

由上可知,有两种类型转换,第1种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5,这种转换称为隐式类型转换。第2种是强制类型转换,也称显式类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如“%”运算符要求其两侧均为整型量,若x为float型,则“x%3”不合法,必须用“(int) x % 3”。强制类型转换运算优先于%运算,因此先进行(int)x的运算,得到一个整型的中间变量,然后再对3求模。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。


结束语

以上,是笔者整理的自我认为本章内重要的内容,内容多数来自《C++程序设计(第三版)》中的第二章内容,希望可以帮助到正在阅读本片文章的你,最后,感谢你的阅读,祝你生活愉快,学习顺利