5.1、C++算数运算符
C++有这几种运算符:加、减、乘、除以及求模。每种运算符都使用两种值(操作数)来计算结果。
+运算符、-运算符、*运算符用法和平时一致。而/运算符作除法运算时结果为商的整数部分,例如:17/3=5,丢弃小数部分;%运算符求模生成第一个除以第二个数的余数。例如:19%6为1,因为19是6的3倍余1。注:两个操作数必须是整数,不能用于浮点数。
5.1.1、运算符优先级和结合性
当多个运算符可用于同一个操作数时,C++遵循通常的代数优先级,先乘除,后加减。也可以使用括号来执行自己的优先级。
当两个运算符的优先级相同时,C++将从左到右结合,先使用左端的运算符。
5.1.2、除法分支
#include <iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
cout << "Integer division: 9/5= " << 9 / 5 << endl;
cout << "Floating_point division:9.0/5.0= ";
cout << 9.0 / 5.0 << endl;
cout << "Mixed devision: 9.0/5= " << 9.0 / 5 << endl;
cout << "double constants:1e7/9.0= ";
cout << 1e7 / 9.0 << endl;
cout << "float constants:1e7f/9.0f= ";
cout << 1e7f / 9.0f << endl;
return 0;
}
从第一行可知,整数9除以5的结果为1,0.8部分被丢弃。当至少有一个操作数是浮点数时,结果为1.8。如果两个操作数都是同一类型,则会自动转换。注:浮点常量默认情况下为double类型。
5.1.3、求模运算符
下面给一个程序:
#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;
}
两个操作数都是int,所以计算机执行整数除法。lbs的值为181,所以表达式的值为12。
5.1.4、类型转换
由于有11种整型和3种浮点类型,因此C++自动执行很多类型转换:
(1)将一种算术类型的值赋给另一种算术运算符;
(2)表达式包含不同类型时;
(3)将参数传递给函数时。
5.1.4.1、初始化和赋值进行的转换
C++允许将一种类型的值赋给另一种类型的变量。例如将short类型的转换为long类型。
将一个值赋给取值范围更大的类型通常不会导致什么问题,只是占用的字节更多而已。但是将很大的long值赋给float变量则会降低精度。由于float只有6位有效数字,如2111222333将会四舍五入为2.11122E9。下面是可能会出现的问题。
5.1.4.2、以{}方式初始化时的转化
它对类型转换要求更严格,列表初始化不允许缩窄,即变量的类型可能无法表示赋给它的值。
5.1.4.3、表达式中的转化
当运算涉及两种类型时,较小的类型将被转换为较大的类型。
5.1.4.4、强制类型转换
C++还允许通过强制类型转换机制显示地进行类型转换。强制转换类型有两种。例如,为将存储在yuanshi中的int值转换为long类型,可以用下列表达式的一种:
(long) yuanshi
long (yuanshi)
强制类型转换不会修改yuanshi变量本身,而是创建一个新的。指定类型的值。
第一种格式来自C语言,第二种格式时纯粹的C++。新格式的想法是,要让强制类型转换就像是函数调用。
C++还引入了4个强制类型转换运算符,对它们的使用要求更加严格,如static_cast<>。
stastic_cast<typeName>(value)