![C++ 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/805/26846805/b_26846805.jpg)
5.2 算术运算符与算术表达式
算术运算符与算术表达式同四则运算基本一致,只是这是在程序中表达,用编程语言来描述。
5.2.1 算术运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P80_11974.jpg?sign=1738882663-73gkKVML9EnkUvrk5zVWtEGyAHUZkySa-0-164d1338b1b624fe0f099e6744eaa3a5)
算术运算符即算术运算符号,是完成基本算术运算的符号,即用来处理四则运算的符号。基本的算术运算有加法、减法、乘法、除法和取模(求余数),见表5-3。
表5-3 算术运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T80_71894.jpg?sign=1738882663-1ls5wq21ZzzOS6R3bI3MrFqOsxmGmw4X-0-1a2645b97584a0486d5ee707370af2f0)
需要说明的是,两个整数相除的结果为整数。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。多数编译系统采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠拢。
如果参加+,-,*,/运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理。
【例5-2】编写程序,完成19和7的算术运算符的操作。
(1)在Visual Studio 2017中,新建名称为“5-2.cpp”的Project2文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P80_71899.jpg?sign=1738882663-gS6csxX1TJibxfLeHdJ6Z0F1oGsUV7WP-0-733e741c4ff98e5604781a1541cd945e)
【程序分析】本程序通过算术运算符对19和7进行加、减、乘、除和求余运算。
在Visual Studio 2017中的运行结果如图5-2所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P80_71898.jpg?sign=1738882663-74zRnQSRpwGYSkFk9eac6IhGljhoS9gJ-0-05ab1cbe9f401fc43fde6de9aa3e8cc0)
图5-2 算术运算
5.2.2 算术表达式和运算符的优先级与结合性
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P81_12079.jpg?sign=1738882663-i4YeZxltQPGn62l3ZPAhZno9pQHFt3ny-0-a4347e3bdcd76c7a429b04ca138982e8)
用算术运算符和括号将运算对象(也称操作数)连接起来的、符合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 表达式中各类数值型数据间的混合运算
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P81_12080.jpg?sign=1738882663-lQJP19YHtuhtCobKsMmbFbApwePLidVg-0-164219252a2779a2b628906f24597bdf)
在表达式中常遇到不同类型数据之间进行运算,例如:
10+'a'+1.5-8765.1234*'b'
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如图5-3所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P81_12076.jpg?sign=1738882663-IaVx6SPLtskDgORLTWIVEgTw4vUgOgIh-0-101a7a03ee3a5748a0644a9a508cd72c)
图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 自增与自减运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P81_12081.jpg?sign=1738882663-Icr2DOggg0f8OWFf4L8ntx5cNiw58po3-0-756abf512f87466d8c9d40e1269351c3)
自增自减运算符存在于高级语言中,它的作用是在运算结束前或后将变量的值加(或减)一。而且自增自减运算符更加简洁,且可以控制效果作用于运算之前还是之后,具有很大的便利性。表5-4是自增自减运算符的说明。
表5-4 自增自减运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-T81_12082.jpg?sign=1738882663-ACWObw23GXT2sQeuW3ukZLMDEH47SWD7-0-27dc36543ba2a7d63dab6ef0ac455235)
下面通过几个例子,详细说明自加、自减算术运算符和表达式的用法。
1. 自加和自减单独运算
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P82_12189.jpg?sign=1738882663-6oXC0EgiEnXVk2Zrd3KQ9hZJEnvZ2loY-0-82900caac8ad6d4a797f9447dbe6b3c6)
无论是前置还是后置,这两个运算符的作用都是使操作数的值增1或减1,但对由操作数和运算符组成的表达式的值的影响却完全不同。
2. 自加前置运算后直接赋值
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P82_12190.jpg?sign=1738882663-QXYR5fVC7WLVbRLy8vB2F0zUQaunwths-0-481d15990db09e17cdf255588000bfa9)
该段语句是自加运算符的前置形式,按照例中对i进行自加前置后,变量i、a、b的值都等于5。
3. 自加前置运算后再赋值
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P82_12191.jpg?sign=1738882663-HOAEPTYaXoqEk2yeOl56iZGhOgxfPPYX-0-0efe8d685936b13056f290073a679267)
该段语句是自加运算符的前置形式,与上例没有太大的不同,只是把上例中的a=++i语句,拆分成两句++i和a=i单独实现了,结果与上例一样。
4. 自加后置运算后直接赋值
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P82_12192.jpg?sign=1738882663-Jw5IOlNaPdUJHyzHNLpy1xhdvv6VSGim-0-40c7b8974036999895b1c91c894fcf7e)
该段语句是自加运算符的后置形式,i是先赋值给a,所以a的值为i的初值,a=4,赋完值后i再自加1,自加1后的结果再赋给变量b。最后通过运算,i和b的值等于5。
5. 自加后置运算后再赋值
例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P82_71906.jpg?sign=1738882663-TogukrkyPtpFI7zC3XMyqaYuLwDtj6VH-0-eb40c41fd3beeb7b16a17cb03c17092b)
这是自加运算符的后置形式,该题目也是把a=i++语句拆分成了两句,分别是i++和a=i,但是运算结果是i、a、b的值都等于5,从中大家可以体会前后置运算的异同。
比较上例结果可知,若对某变量自加(自减)而不赋值,结果都是该变量本身自加1或减1;若某变量自加(自减)的同时还要参加其他的运算,则前置运算是先变化后运算,后置运算是先运算后变化。
【例5-3】编写程序,完成自加自减运算符的操作。
(1)在Visual Studio 2017中,新建名称为“5-3.cpp”的Project3文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P83_12350.jpg?sign=1738882663-7hRrqP5FqqURBFCSl6CTSB2AdHnDS42b-0-9a1f2c3672cf3f24695ab13211844ba8)
【程序分析】本程序通过定义变量并初始化赋值,再进行自加自减运算。
在Visual Studio 2017中的运行结果如图5-4所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P83_12346.jpg?sign=1738882663-AXMw85VnMjL56nhzRBfWEkDBMyF1ynQw-0-7c47d7e0c037a651aa76972c6e71241c)
图5-4 自加自减运算
5.2.5 强制类型转换运算符
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P83_12349.jpg?sign=1738882663-AdZ65CbKvtjpAHMXB5zXC01lXVdPdgX7-0-ddc2d87257107f29a555262390ee3fab)
如果需要人为地将一种类型转换为另一种类型,必须使用C++提供的强制类型转换运算符。例如:
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P83_12351.jpg?sign=1738882663-oQWqFSsFXM5PcaRk4eYiWXWcgcmzpQrV-0-362358b44858dbf5b76cf8a1d9f46b50)
强制类型转换的一般形式为:
(类型名)(表达式)
注意:如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来。如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式需要用括号括起来。
如果写成:
(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)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P84_12516.jpg?sign=1738882663-BuwefgvAqVpC4r8hbg2Abf5kuJpMmFbc-0-34da57b8f5512b975c2c996cff22cc77)
【程序分析】本程序中,定义了x为float型的变量,i为int型的变量,给x赋初值为1.0。通过数据类型转换,将变量x的值赋给i。
在Visual Studio 2017中的运行结果如图5-5所示。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P84_12511.jpg?sign=1738882663-Jr11xJI7rwjCuaTXHGMiZ9JV0shlY1vH-0-bd406cbb8addca28a71218b7cac88fea)
图5-5 强制类型转换