C++ 从入门到项目实践(超值版)
上QQ阅读APP看书,第一时间看更新

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 强制类型转换