5.2 算术运算符与算术表达式
算术运算符与算术表达式同四则运算基本一致,只是这是在程序中表达,用编程语言来描述。
5.2.1 算术运算符
算术运算符即算术运算符号,是完成基本算术运算的符号,即用来处理四则运算的符号。基本的算术运算有加法、减法、乘法、除法和取模(求余数),见表5-3。
表5-3 算术运算符
需要说明的是,两个整数相除的结果为整数。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。多数编译系统采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠拢。
如果参加+,-,*,/运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理。
【例5-2】编写程序,完成19和7的算术运算符的操作。
(1)在Visual Studio 2017中,新建名称为“5-2.cpp”的Project2文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本程序通过算术运算符对19和7进行加、减、乘、除和求余运算。
在Visual Studio 2017中的运行结果如图5-2所示。
图5-2 算术运算
5.2.2 算术表达式和运算符的优先级与结合性
用算术运算符和括号将运算对象(也称操作数)连接起来的、符合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的运算。“自左至右”的结合方向又称“左结合性”,即运算对象先与左面的运算符结合。以后可以看到有些运算符的结合方向为“自右至左”,即右结合性(例如赋值运算符)。关于“结合性”的概念在其他一些高级语言中是没有的,是C++的特点之一,希望读者能理解清楚。
5.2.3 表达式中各类数值型数据间的混合运算
在表达式中常遇到不同类型数据之间进行运算,例如:
10+'a'+1.5-8765.1234*'b'
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如图5-3所示。
图5-3 不同类型之间的转换
假设已指定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型。
上述的类型转换是由系统自动进行的。
5.2.4 自增与自减运算符
自增自减运算符存在于高级语言中,它的作用是在运算结束前或后将变量的值加(或减)一。而且自增自减运算符更加简洁,且可以控制效果作用于运算之前还是之后,具有很大的便利性。表5-4是自增自减运算符的说明。
表5-4 自增自减运算符
下面通过几个例子,详细说明自加、自减算术运算符和表达式的用法。
1. 自加和自减单独运算
例如:
无论是前置还是后置,这两个运算符的作用都是使操作数的值增1或减1,但对由操作数和运算符组成的表达式的值的影响却完全不同。
2. 自加前置运算后直接赋值
例如:
该段语句是自加运算符的前置形式,按照例中对i进行自加前置后,变量i、a、b的值都等于5。
3. 自加前置运算后再赋值
例如:
该段语句是自加运算符的前置形式,与上例没有太大的不同,只是把上例中的a=++i语句,拆分成两句++i和a=i单独实现了,结果与上例一样。
4. 自加后置运算后直接赋值
例如:
该段语句是自加运算符的后置形式,i是先赋值给a,所以a的值为i的初值,a=4,赋完值后i再自加1,自加1后的结果再赋给变量b。最后通过运算,i和b的值等于5。
5. 自加后置运算后再赋值
例如:
这是自加运算符的后置形式,该题目也是把a=i++语句拆分成了两句,分别是i++和a=i,但是运算结果是i、a、b的值都等于5,从中大家可以体会前后置运算的异同。
比较上例结果可知,若对某变量自加(自减)而不赋值,结果都是该变量本身自加1或减1;若某变量自加(自减)的同时还要参加其他的运算,则前置运算是先变化后运算,后置运算是先运算后变化。
【例5-3】编写程序,完成自加自减运算符的操作。
(1)在Visual Studio 2017中,新建名称为“5-3.cpp”的Project3文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本程序通过定义变量并初始化赋值,再进行自加自减运算。
在Visual Studio 2017中的运行结果如图5-4所示。
图5-4 自加自减运算
5.2.5 强制类型转换运算符
如果需要人为地将一种类型转换为另一种类型,必须使用C++提供的强制类型转换运算符。例如:
强制类型转换的一般形式为:
(类型名)(表达式)
注意:如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来。如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式需要用括号括起来。
如果写成:
(int)x+y
该语句表示,只将x转换成整型,然后与y相加。
以上强制类型转换的形式是原来C语言使用的形式,C++把它保留了下来,以利于兼容。C++还增加了以下形式:
类型名(表达式)
例如:
int(x) 或 int(x+y)
类型名不加括号,而变量或表达式用括号括起来,这种形式类似于函数调用。但许多人仍习惯于用第一种形式,把类型名包在括号内,因为这样比较清楚。
需要说明的是在强制类型转换时,得到一个所需类型的中间变量,但原来变量的类型未发生变化。例如:
(int)x
如果x原指定为float型,值为1.0,进行强制类型运算后得到一个int型的中间变量,它的值等于1,而x原来的类型和值都不变。
【例5-4】编写程序,完成强制类型转换。
(1)在Visual Studio 2017中,新建名称为“5-4.cpp”的Project4文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本程序中,定义了x为float型的变量,i为int型的变量,给x赋初值为1.0。通过数据类型转换,将变量x的值赋给i。
在Visual Studio 2017中的运行结果如图5-5所示。
图5-5 强制类型转换