2.3.7 算术操作符和表达式
在C++(www.cppentry.com)程序中,可利用算术操作符合并变量和/或数字。这些操作符包括+(加)、-(减)、*(乘)和/(除)。例如,图2.1的程序用操作符*求两个变量值的积,结果放入等号左侧的变量:
- total_weight = one_weight * number_of_bars;
所有算术操作符都可作用于两个int或者两个double,甚至允许一样一个。但是,确切的结果值及其类型取决于被合并的数字的类型。两个操作数(也就是两个数字)都是int,用算术操作符合并的结果也是int。一个(或两个)操作数是double,结果就会变成double。例如,假定变量base_amount和increase都是int,则以下表达式的结果也是int:- base_amount + increase
然而,其中任何一个是double,结果就是double。将以上表达式中的符号+换为符号-,*或者/,这一点同样成立。
结果类型的重要性可能超乎你的想象。例如,7.0/2有一个double类型的操作数,即7.0,所以结果是double值3.5。然而,7/2的两个操作数都是int类型,所以结果是int值3。即使结果表面上相等,但实际可能还是有区别。例如,6.0/2有一个double类型的操作数,即6.0,所以结果是double值3.0,它只是一个近似值。但是,6/2有两个int类型的操作数,所以结果是int值3,这是一个精确值。除法操作符是受参数类型影响最大的操作符。
使用除法操作符时,如果一个或两个操作数是double类型,结果是符合预期的。但是,为int类型的两个操作数使用除法操作符,只能获得除法运算结果的整数部分。也就是说,整数除法丢弃了小数部分。所以,10/3的结果是3(而不是3.3333…),5/2的结果是2(而不是2.5),11/3的结果是3(而不是3.6666…)。注意,这些数字没有进行四舍五入,小数部分会被直接丢弃,不管它有多大。
将操作符%应用于int类型的操作数,可以还原使用/对两个整数进行除法运算时丢失的信息。应用于int值时,两个操作符/和%将生成执行长除法时获得的两个数字(长除法是中学知识)。例如,17用5来除,商是3,余是2。/运算得到的是商,%得到的就是余。例如,以下语句:
- cout << "17 divided by 5 is " << (17/5) << endl; // 商
- cout << "with a remainder of " << (17%5) << endl; // 余
输出如下:- 17 divided by 5 is 3
- with a remainder of 2
图2.5演示了将操作符/和%应用于int值时的情况。
|
| 图2.5 整数除法 |
向负int值应用/和%操作符的结果因C++(www.cppentry.com)实现而异。所以,为了保证程序的可移植性,只有在确定两个int都非负时,才为它们使用操作符/和%。
算术表达式中可加入合理的空白间距。可以在操作符和圆括号前后插入空格,当然也可以不加。只要易于阅读,加或不加可自由选择。
可以插入圆括号来指定运算顺序,如以下两个表达式所示:
- (x + y) * z
- x + (y * z)
对第一个表达式求值时,计算机首先使x和y相加,再将结果乘以z。对第二个表达式进行求值时,计算机首先使y和z相乘,再将结果加到x上。尽管数学公式中可以使用方括号和其他形式的括号,但在C++(www.cppentry.com)中是不允许的。C++(www.cppentry.com)只允许在算术表达式中使用圆括号来指定运算顺序。其他形式的括号留作其他用途。
如果省略圆括号,计算机将根据优先级规则来决定操作符(如+和*)的求值顺序。这些优先级规则与代数和其他数学课采用的规则相似。例如,对以下表达式求值时:
- x + y * z
将首先执行乘法运算,再执行加法运算。但即使加或不加圆括号都不会改变运算顺序,除非是一些非常标准的情况(比如一连串的加法,或者在一个加法运算中嵌入一个简单的乘法),否则最好坚持用圆括号指定执行顺序。圆括号使表达式更容易理解,并能避免出错。附录2给出了完整的C++(www.cppentry.com)优先级规则。
视频讲解:Precedence and Arithmetic Operators
图2.6展示了常见算术表达式的一些例子,并给出了对应的C++(www.cppentry.com)表达式。
|
| 图2.6 算术表达式 |