赋值运算符之后呢我们再来看一下算术运算符。 算术运算符呢大概是我们最熟悉的一种运算符了。
那么,加,减,乘,除,啊唯一多了一个呢,就是一个百分号。
百分号呢,是一个模运算。这个我们已接触过了。
模运算就是求余运算。当然,它参与运算的个位呢必需是整数。
这是一个规则。比方说,7 模 4
= 3, 那么算术运算符呢我们不需要多说。啊,有几条需要注意的,
跟大家说一下。第一条需要注意的呢就是说,
整数运算,凡是有整数参与的运算,
那么我们的计算结果呢,仍然为整数。啊,这是一条非常非常常用,
但是很容易被忽略的计算规则。比方说,5
除於 3 , 5 除以 3 的结果是多少呢,很多同学可能觉得都是
1.6666666,实际上不是。
在这儿,5 除以 3 的结果呢,就是 1 。啊它的小数部分就被忽略了 。
那,为什么呢? 因为啊, 在这个运算式里头只出现了整数。
整数跟整数进行运算,结果仍然是整数。
这是第一条,整数的运算,结果仍为整数。 再来第二条,实数的运算。结果呢,都是
double 型。也就是说,在一个运算式里面,
只要出现了实数,比方说,5.3 除以 3 , 或者是 5 除以 3.0
,只要出现了浮点数或者是实数, 那么运算结果就一定是 double 型的。为什么呢?
不为什么,这是规则。 同时呢,我还要在这儿强调一点。那么既然 5 除以 3 , 它结果呢,是一个
double 型的数。 double 型的数呢,它的表示精度就是有一个范围的。
啊,它不可能无限制的表示下去。ii, 5 除以 3 结果是 1.66666,
是一个无限循环小数,一个 double 型是 15 位精度,
到达了15 位精度的时候,那个 6 到底要舍7呢,还是要进位进上去,
乘以 1.6666666模位7 呢? 在这儿呢,需要强调一下。
舍入的这个方向啊,随编译器的不同,将会出现不同。
有可能出现 4 舍 5 入,有可能出现 5 舍 6 入, 都是有可能出现的。
那最好的办法就是你写一个式子,试一下。算术运算符的基本含义就是这样的。
那么关于算术运算符以及我们后面要讲到的关系运算符和逻辑运算符,
有一个非常非常非常重要的特性,是需要大家一定要清楚,并且要掌握的。
那就是关于运算符的优先级。比方说,算术运算符的优先级。
这个我们从小就知道了,先乘除,再加减。这就是指的优先级。
这当乘除或加减出现在一个表达式里的时候,肯定的我们
要先算乘除再算加减。啊,什么叫优先级,这个就叫优先级。
当然了,在这儿我们需要说乘除的优先级啊不如括号高,啊。
这个不需要我们说了,从小学我们就知道了。需要说的就是模运算。
模运算的优先级呢,跟乘除的优先级是平级的。 对于平级的运算符而言,计算顺序又是怎么样的呢?
啊先左,后右。啊,就是我们,跟我们小学学过的东西是一样的。
同一级别中,采取由左至右的结合方向。比方说,对于
a - b + c 那就相当于 a - b 括起来再加 c
,对于 a 模 b 乘 c 除 d , 那就相当于先算 a 模 b,
然后再算 a 模 b 的结果乘以 c , 最后把整个的结果除以
d ,这样的一个运算顺序。 从左至右的结合方向,先算左边,然后再算右边。
那看上去呢,好像是运算符的优先级是一件挺易解的事情,对嘛呵。
并不难。但是,当多个运算混合在一起的时候,
有的时候,运算符的优先级顺序啊,还真的不是那么好办。
如果这件事情再加上跟刚才我们讲到的,
不同数据类型的值混合在一起的时候,可能情况就会变得稍微复杂一些。
那么,我们来看一个例子。看这个表达式。 123
模 s + i + @ 再 + i 乘以 u 减去 f 除以
d。 啊,这个表达式呢比较长一点。里面出现的类型呢,
也比较丰富。那就变量而言呢,其中,s 是 short
型, i 是 int 型, 那么 u 呢, 是 unsigned int
型, f 呢,是 float 型, d 是 double 型,类型都比较多了。
那对于这样的一个表达式,我们应该怎么去计算它呢? 啊,没关系。
在这儿呢,我借着这个例子,介绍给大家一种来求解表达式的值,和处理表达式中,
数据类型的转换关系的方法。
那么我把这种方法呢,取了一个名字,叫做剪刀法。什么意思呢?
就是说啊, 那么当你要求解一个表达式的时候啊,也就想象一下,啊,
在你的口袋里,装了一把剪刀,或者砍刀也行啦。那么当你面临一个表达式的时候呢,
就拿出这把剪刀,从整个表达式中,
运算符优先级最低的地方先剪断。
啊,比方说对于这个表达式,那谁的运算符的优先级最低啊 ?我们来分析一下。那么根据我们刚才
对算术运算符优先级的一个描述,括号最高,乘除,模次之,
那么加减是最低了。所以说我们要优先
从这些加减符号里面去选。然后呢,又有一条规则说,
当运算符优先级别是相同的时候,那么按照从左到右的方式来进行运算。
那么所以最左边的这个减号,它的运算符优先级是最低的。
于是我们第一刀从这儿把它砍断。
啊,基本说来,这是第一刀。第一刀砍完了之后呢,
这个式就断为了两节。第一节是这个,啊, 第二节是这个。
那么我们再去看,分别再去看这两节。那么当然我们先去分析前面这一节。前面这一节里头, 谁的优先级又是最低的呢
?无疑这个 + 号又是最低的。于是第二刀在这里砍断。
我们接着砍下了这个第二刀。那么,又把这个式子断成了两节。这是一节,这是一节。
那么对于左边的这个表达式,无疑第三刀我们从这儿把它砍断。这是第三刀。砍到这个份上,
那么剩下的,就是只包含一个运算符的了。
那么到现在为止呢,我们就用三刀把这个长长的表达式砍成了一,二,三,四段。
把它砍成了四段。 那这四段怎么去计算呢?
很简单。 最后被砍下来的表达式要先进行运算。
比方说,这两个表达式,是最后被砍下来的。那么这两个表达式呢,
是最后被砍下来的,所以要先进行计算。我们来先分析一下。第一个表达式,123
模 s, 123 呢,如果没有特别注释的话,它应该是
int 型的。s 呢, 是 short 类型的。 int 类型的和
short 类型的进行计算。那么计算结果是什么呢
? 在这儿我先告诉你,如果一个表达式里面出现了short 类型, 那么所有的
short 类型必需要先转换成 int 类型,然后再去进行运算。 所以说 123
模 s 的计算结果一定是 int 型的。 我们再来看右边,i
+ @, @ 号呢是一个字符号。我们都知道字符的
存储方式跟整数是一样的,所以它们两个是可以进行混合运算的。
那么当字符跟一个整数进行运算的时候,那这个时候,
我也可以告诉你,那要把字符型转换成 int 型,然后才能进行运算。
所以说,它们两个的计算结果也是 int 型的。
啊,这是第二。当它们两个计算完毕以后呢,啊我们再考虑第二刀
砍下来的表达式,啊,要进行计算。也就是它们两个,是第二刀砍下来的。
这儿还有一个,也是第二刀砍下来的。我们先来看它们的运算结果。 int
型跟 int 型进行运算,毫无疑问,结果是 int 型。我们再来看, i 乘於 u
, 因为 u 呢, 是 unsigned 的型,i 是 int 型, 那么我也告诉你, 如果一个
int 型的数跟一个 unsigned 型的数进行运算的话,那么无论这个
int 型的数 是正数还是负数,都要先转换成
unsigned 的类型, 然后再进行运算。 所以说它们的运算结果也是
unsigned 的类型, 啊也是这个类型。 那么现在呢,那如果把这个表达式
跟它放在一起进行运算的话,那它们两个的运算结果是什么类型呢 ?
那么我们刚刚介绍过,它的结果应该是 unsigned 的类型。 Ok,
那么第二刀砍下来的表达式我们又计算完毕了。 再看第一刀砍下来的两个表达式,
那么第一刀砍下来的两个表达式现在呢就剩了一个了。啊就剩这个了。因为左边已经计算完毕了。
那么右边的这个表达式,一个 float 的型的数跟
一个 double 型的数进行运算,这个时候我也告诉你,那么这个结果呢,应该是 double 型, double 型。
Ok, 那现在呢,要把第一刀砍下来的两个数值合起来再进行计算。
也就是这个 unsigned 的型要跟这个 double 型进行计算了。
那么这个计算结果呢,我也可以告诉你,它的计算结果只能是double型。
OK,那么整个这个式子呢就计算完毕了。这就是
这个式子的计算过程。那么通过这个例子呀,
我们可以看到,当我们碰到一个长长的表达式的时候,
我们可以用这个剪刀法把它剪成一段一段的。
然后呢,按照剪下来的逆序,把这一段
一段的全部都计算好。最后再去获得整个表达式的值。 那么我希望呢,大家能掌握这种方法。
那有的同学可能说了,掌握这个方法呀没有问题,
但是呢,关于在一个表达式里头进行计算的时候,
数据类型的转换方式,我仍然是不清楚呀。
那怎么办呢?别担心,我这给一个图。这个图呢就表示了
计算过程中那么各种数据类型之间的转换方向。
这个图这么来看,那么在这个图上呢,有一些箭头
是纵向的,那么有一些箭头呢是横向的。 有什么区别呢?它的含义是这样的。
我们先来解释一下横向的箭头。看这,那么char型和short型都有一个箭头指向了int型。
它表示什么含义呢?它的含义是这样的。
在一个表达式中,只要出现了
一个char型或者是short型的量, 无论是变量还是常量,
那么不管char型或者short型的这个量 要跟什么样的其他的量进行运算,
那么我们都先把这个量啊转换成一个int型的量,
然后再参与其他的运算。这就是横向箭头的
意思,也就是说,只要是在一个表达式里面出现了char型或者short型,
那么要进行运算的话,就要先把这个char型或者short型的数
转换成int型,然后再进行运算。
也就。这个转换是必定要进行的。比方说,在我们刚才举的这个
例子里头,那么出现了short型,也出现了char型。
那么无论这个short型的数要跟一个什么样的数进行计算,
我都先把这个short型的数转换成一个int型的数。
啊也无论这个char型的数要跟什么类型的数进行计算,我都先把这个char型的数转换成int型。
然后再跟其他的类型进行计算。那么相同的情况呢,
还有float型。也就是说只要一个表达式里面出现了float型,
不管这个float型要跟什么其他的类型进行计算,我都先把这个float型转换
成double型。然后我们再说别的。这是一定要进行这个转换。
这是横向箭头的意思。再看纵向的这个箭头。比方说int型到
unsigned型,它的含义是这样的,如果一个int型的数
跟一个unsigned型的数进行运算的话,那么
先把这个int型的数转换成unsigned型的数。
然后再进行运算。当然结果也是一个unsigned型的数。
啊这是它们的含义。那么第二个,当unsigned型的数跟一个unsigned long型的数
进行运算的话,那么先要把unsigned型的数转换成unsigned
long int型的数。然后再进行运算。
这是这个含义。那有的同学要问了,为什么不在这直接写unsigned long int型呢?
因为这个式子里面还有一层含义,那就是说当int型的数跟long型的数
啊一起运算的话,它们两个的类型都是signed的类型,都是
有符号的数,那么就把int型的数转换成long int型的数,
那么再进行运算。也就是说啊,这个箭头只表示一个级别。
也就是说,上面的数的级别要更高一些,底下的数呢级别要稍微低一些。
那么最高的级别就是double型。我们可以看到在
整整个这个式子里边所有的箭头都指向了double型。
那么由此我们就可以断定,只要一个表达式里头出现了
double型,那么整个这个表达式计算的值一定是一个
double型的数。这就是数据类型转换的方向。那么,
这个转换的方向呢也是非常重要的一点,要求呢大家掌握,而且呢,
在我们接下来的课里头啊我们会反复地提到这个,也会反复地跟大家一起来进行训练的。
所以说呢,一时半会听不懂没关系,我们还会反复提到的。OK,那么
关于算术运算符啊,我们讲差不多了,只剩下最后一点点。
这一点点呢还挺麻烦,这一点点就是加加