3.4 C++算术运算符
大家可能还对学校里做的算数练习记忆犹新,在计算机上也能够获得同样的乐趣。C++使用算术运算符来运算。它提供了几种运算符来完成5中基本的算术运算:加法、减法、乘法、除法以及求模。每种运算符都使用两个值(操作数)来计算结果。运算符及其操作数构成了表达式。例如,在下面的语句中:
int wheels = 4 + 2;
4和2都是操作数,+是加法运算符,4+2则是一个表达式,其值为6.
下面是五种基本的C++算术运算符。
l +运算符对操作数执行加法运算
l -运算符从第一个数中减去第二个数。
l *运算符将操作数相乘
l /运算符用一个属出于第二个数,如果两个操作数都是整数,则结果为商的整数部分,小数部分被丢弃
l %运算符求模,也就是说,它生成第一个数除以第二个数后的余数,两个操作数必须都为整数
当然,变量和常量都可以用作操作数,程序3.10说明了这一点。由于%操作数只能是整数,因此将在后面的例子中讨论它
//arith.cpp——some C++ arithmetic #include<iostream> int main() { using namespace std; float hats,heads; cout.setf(ios_base::fixed,ios_base::floatfield); cout<<"Enter a number :"; cin>>hats; cout<<"Enter another number : "; cin>>heads; cout<<"hats = "<<hats<<" ; heads ="<<heads<<endl; cout<<"hats + heads = "<<hats+heads<<endl; cout<<"hats - heads = "<<hats-heads<<endl; cout<<"hats * heads = "<<hats*heads<<endl; cout<<"hats / heads = "<<hats/heads<<endl; return 0; }
也许读者对得到的结果心存怀疑。11.17加上50.25应等于61.42,但是输出中却是61.419998。这不是运算问题;而是由于float类型表示有效位数的能力有限。记住,对于float,C++只保证6位有效位。如果将61.419998四舍五入成6位,将得到61.4200,这是保证精确度下的正确值,如果需要更高的精度,请使用double或long double。
3.4.1 运算符优先级和结合性(请参考https://blog.csdn.net/qq_41200424/article/details/80439797,上一篇博客)
3.4.2 除法分支
//divide.cpp——integer and floatint-point division #include<iostream> int main() { using namespace std; float hats,heads; cout.setf(ios_base::fixed,ios_base::floatfield); cout<<"Integer division : 9/5 = "<<9/5<<endl; cout<<"Floating-point divisoin : 9.0/5.0 = "<<9.0/5.0 <<endl; cout<<"Mixed division : 9.0/5 = "<<9.0/5<<endl; cout<<"double constants : 1e7/9.0 = "<<1e7/9.0<<endl; cout<<"float constants : 1e7/9.0f = "<<1e7/9.0f<<endl; return 0; }
注意:如果编译器不接受setf()中的ios_base,请使用ios。
有些基于ANSI C之前的编译器的C++实现不支持浮点常量的f后缀。如果面临这样的问题,可以用(float)1.e7/(float)1.e7f/9.0f。
有些实现会删除结尾的零。
从第一行输出可知,整数9除以5的结果为整数1。4/5的小数部分(或0.8)被丢弃。在本章后面学习求模运算符时,将会看到这种除法的实际应用。接下来的两行表明,当至少有一个操作数是浮点数时,结果为1.8。实际上,对不同类型进行运算时,C++将把它们全部转换为同一类型。本章稍后会介绍这种自动转换。最后两个的相对精确度表明,如果两个操作数都是double类型,则结果为double类型;如果两个操作数都是float类型。记住,浮点常量在默认额度情况下为fouble类型。
运算符重载介绍
在程序3.11中,除法运算符表示了3中不同的运算:int除法、float除法和double除法。C++根据上下文(这里是操作数的类型)来确定运算符的含义。使用相同的符号进行多种操作叫做运算符重载。C++有一些内置的重载示例。C++还允许扩展运算符重载,以便能够用于用户定义的类,因此在这里看到的是一个重要的oop属性。
int 类型 9/5 执行int除法 |
long 类型 9L/5L 执行long除法 |
double 类型 9.0/5.0 执行double除法 |
Float 类型 9.0f/5.0f 执行float除法 |
3.4.3 求模运算符
比起求模运算符来说,多数人更熟悉加、减、乘、除,因此这里花些时间介绍这种运算符。求模运算符返回整数除法的余数。它与整数除法相结合,尤其适用于解决要求将一个量分成不同的整数单元的问题,例如将英寸转换为英尺和英寸,或者将美元转换为元、角、分、厘。第二章的程序2.6将重量单位英尺转换为磅。程序3.12将磅转换为英石。记住,一英石等于14磅,多数英国浴室都使用这种单位。该程序使用整数除法来计算合多少英石,再用求模运算符来计算余下多少磅。
//modulus.cpp——uses % operator to convert lbs to stone #include<iostream> int main() { using namespace std; const int Lbs_per_stn=14; int lbs; cout<<"Enter your weight in pounds : "; cin>>lbs; int stone = lbs/Lbs_per_stn; int pounds = lbs % Lbs_per_stn; cout<<lbs<<" pounds are "<<stone<<" stone, "<<pounds<<" pound(s).\n"; return 0; }
在表达式Lbs/lbs_per_stn 中,两个操作数的类型都是int,所以计算机执行整数除法。lbs的值为181,所以表达式的值为12.12和14的乘积是168,所以181与14相除的余数是9,这就是lbs%Lbs_per_stn的值,现在即使在感情上还没有适应英国的质量单位,但在技术上也做好了去英国旅游时解决质量单位转换问题的准备。