23-C++-算术运算符

3.4  C++算术运算符

大家可能还对学校里做的算数练习记忆犹新,在计算机上也能够获得同样的乐趣。C++使用算术运算符来运算。它提供了几种运算符来完成5中基本的算术运算:加法、减法、乘法、除法以及求模。每种运算符都使用两个值(操作数)来计算结果。运算符及其操作数构成了表达式。例如,在下面的语句中:

int wheels = 4 + 2;

42都是操作数,+是加法运算符,4+2则是一个表达式,其值为6.

下面是五种基本的C++算术运算符。

l +运算符对操作数执行加法运算

l -运算符从第一个数中减去第二个数。

l *运算符将操作数相乘

l /运算符用一个属出于第二个数,如果两个操作数都是整数,则结果为商的整数部分,小数部分被丢弃

l %运算符求模,也就是说,它生成第一个数除以第二个数后的余数,两个操作数必须都为整数

当然,变量和常量都可以用作操作数,程序3.10说明了这一点。由于%操作数只能是整数,因此将在后面的例子中讨论它

程序3.10   arith.cpp

//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;
} 

下面是该程序的输出,从中可知C++能够完成简单的算术运算;

也许读者对得到的结果心存怀疑。11.17加上50.25应等于61.42,但是输出中却是61.419998。这不是运算问题;而是由于float类型表示有效位数的能力有限。记住,对于floatC++只保证6位有效位。如果将61.419998四舍五入成6位,将得到61.4200,这是保证精确度下的正确值,如果需要更高的精度,请使用doublelong double

3.4.1 运算符优先级和结合性(请参考https://blog.csdn.net/qq_41200424/article/details/80439797,上一篇博客)

3.4.2 除法分支

除法运算符(/)的行为取决于操作数的类型。如果两个操作数都是整数,则C++将执行整数除法,这意味着结果的小数部分将被丢弃,使得最后的结果是一个整数。如果其中一个(或两个)操作数都是浮点值,则小数部分将被保留,结果为浮点数。程序3.11演示了C++除法如何处理不同类型的值。和程序3.10一样,该程序也调用setf()成员函数来修改结果的显示方式。

//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

有些实现会删除结尾的零。

下面使用某些实现时,程序3.11中程序的输出:

从第一行输出可知,整数9除以5的结果为整数14/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磅,多数英国浴室都使用这种单位。该程序使用整数除法来计算合多少英石,再用求模运算符来计算余下多少磅。

程序3.12    modulus.cpp

//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.1214的乘积是168,所以18114相除的余数是9,这就是lbs%Lbs_per_stn的值,现在即使在感情上还没有适应英国的质量单位,但在技术上也做好了去英国旅游时解决质量单位转换问题的准备。

猜你喜欢

转载自blog.csdn.net/qq_41200424/article/details/80448619
今日推荐