《C++自学入门》3.基本数据类型-3
1.C++算术运算符
1.1 基本运算符
读者可能还对学校里的算术练习记忆犹新,在计算机上也能够获得同样的乐趣,C++使用运算符来运算。它提供了几种运算符来完成五种基本的算术运算:加法、减法、乘法、除法以及求模。每种运算符都使用两个值来计算结果。运算符及其操作数构成了表达式,例如:int wheels = 4 + 2;4和2都是操作数,+是加法运算符,4+2则是一个表达式,加减乘除就不多赘述了,只说一下取余:%,5%2结果就是1,因为余数就是1。而且%的操作数只能是整数。
1.2 优先性和结合性
<1> int a = 2 – 3 * 4 + 5;操作数3旁边有两个运算符 – 和 *,当多个运算符可用于同一个操作数时,C++使用优先级规则来决定先使用哪个运算符,和我们小数学的四则运算一样,先乘除,再加减。答案为-5,优先级*、/、%同级。
<2> float logs = 120 / 4 * 5;有时候优先级列表并不够用,操作数4也位于两个运算符之间,但运算符乘除一样,计算机该怎么计算呢,这里答案是6,因为C++的结合性,将从右往左运算。
<3> int dues = 20 / 4 + 2 * 3;仅当两个运算符被用于同一个操作数时,优先性和结合性规则才有效,优先级表示在做加法之前必须计算除法和乘法,但是优先级和结合性都没有指出应该先计算20 / 4还是2 * 3;事实上,C++吧这个问题留给了实现,让它来决定在系统中的最佳顺序。
运算符优先性和结合性在C++中远远不止这么一点,当逻辑运算符,算术运算符,关系运算符等结合在一起时,那才是脑壳大(我们后面慢慢来)。
1.3 类型转换
C++丰富的类型允许根据需要选择不同的类型,这也使计算机的操作更复杂。例如,将两个short值相加涉及到的硬件编译指令可能会与两个long值相加不同。由于有11种整型和3种浮点类型,因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时。为处理这种潜在的混乱,C++自动执行很多类型转换==>>:
一、将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换; 二、表达式种包含不同的类型时,C++将对值进行转换; 三、将参数传递给函数时,C++将对值进行转换。
如果程序员不知道进行这些自动转换时将发生的情况,将无法理解一些程序的结果,下面看看例子:<1>隐式转换:高精度-》低精度,有符号-》无符号。优先级:int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double。下面看一个经典例子:
查看代码
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
unsigned int a = 6;
int b = -20;
cout << hex << b << endl;
cout << hex << a + b << endl;
if(a + b > 0)
cout << "ok!" << endl;
else
cout << "error!" << endl;
return 0;
}
我们可以猜猜结果是打印ok还是error,可能大家会觉得a + b不就是-14吗,肯定会打印error,其实不然,结果是ok。我们知道有符号会向无符号隐式转换,而且无符号最高位不表示符号,我们根据这两点就可以推断出结果。