上次介绍了变量和类型转换,但都是单个的变量,没什么价值,这篇我们就让变量运算起来。变量参与运算,这就需要运算符。Java里面有三种运算符,最基本的运算符和数学符号一致,加减乘除,还有一个用百分号表示求余数的,又叫做取模。这五种方式就跟算算数一样,所以并称为算术运算符。
+号和-号不说了,*号代表乘法,注意乘号不是x,你要是写x系统就默认你创建了一个叫x的变量,就错了。"/"代表求商,"%"是求余,又叫取模。有时候会看到取模这俩字,指的就是求余数。创建一个叫Operators.java的文件,然后复制下面的内容:
声明int a = 5; int b = 6; int c; c = a + b; 然后打印c。猜的到结果吧?很简单,得11。这是咱们第一次让变量之间交流,那它的运行原理是什么样呢?看我画张图。你或许注意到我一直在讲内存里是怎么工作的,不要嫌烦,现在看起来很简单,但我发现很多朋友如果不深刻理解这块儿,以后讲复杂的过程理解起来就有点吃力。咱们不怕慢,一定把基础搞好。而且测试员本身就要测一切,包括内存,大家一定别忽视。
内存自动开辟了两个空间分别存a和b的值,然后又开辟了一个空间准备存c。c一开始是空的,a和b的值现在是十进制的数,但运算的时候其实是分别转换成二进制码后相加,最后把结果存到c这个空间里。这就是a+b的原理。那如果我算a*b呢?如果a%b呢?一样的道理:
算出来c等于30。简单说说,第一句话int a = 5, b = 6;,声明同一类型变量的时候可以写在同一行,中间用逗号隔开。而且只用在第一个前面加上类型就可以了。第二句话int c = a*b;,可以边声明新变量边用一个计算结果赋值。这些都是经验,没事多练多编译,你会发现很多简便的写法。
当然,有时候不止两个数进行运算,好几个数运算的时候可能有加减有乘除,比如a+b*c/d-e.这种情况下会怎么样?先做哪步?答案跟咱们小学学数学时一样 – 先乘除后加减。那如果是同级呢?比如这里乘和除是同级的,答案是同级从左到右依次计算。我们小学数学里可以加括号,对吧?那我们加个括号呢?优先级又变了。还是跟数学一样,括号优先。先算a+b。
计算结果是-25,这就是简单的四则运算,你也可以试试求余数。现在我把c = a + b那个例子改一下,写成int a = 5; int b = 6; a = a + b; 这里面没有c了:
打印一下,a变成了11。这种情况和上面的a+b不一样,这次是最后是把11再赋回给a,这样a就存11了,b还是6。内存图就变成这个样子:
假如我们不停地执行a=a+b,第二次a等于17,b还是6。再执行一遍:a等于23,b还是6。执行到这里我们是不是发现,如果我们一直执行a=a+b,a会一直增加,而增加的值就是b的值?b是不是感觉好像一个固定的增长幅度?
所以,像a=a+b这种情况有一个更简单的写法:a+=b。左边是最终要改变的值,右边是幅度。比如咱们这个例子中a从5变到11,b是5变到11的幅度,上面的程序可以简写成:
这就是咱们的算术运算符的第一个补充。当然,有+=,就有-=,*=,/=。大家没事可以自己去试试。再举个例子,这次我把b都去掉了:
这里面的a值最后得6,当然,你也可以写成a += 1。但因为幅度是1,所以这种情况还有一种福利写法:a++和++a。++默认就是+1。注意,幅度一定是1,否则不能这么写。你要是a = a + 2,只能老老实实写a += 2。看看下面的a++和++a举例,它们都打印出6:
那a++和++a有区别么?我还是用例子解释,先说++a,我再把b请回来:
打印结果b等于6。而a++呢?
看,b的值这次等于5了。为什么明明单独写a++和++a结果一样,但赋给b就不一样了呢?原因在于操作的顺序不同!b = ++a的内存工作原理是先加后赋值。先让a自增1,然后把结果赋给b,相当于这样:
而b = a++则是先把a的值赋给b,再让a自增1,顺序正好相反:
注意,只有++和--,没有别的了,"//"不是除的意思,而是注释。
这就是算术运算符的概念。第二种叫做关系运算符。关系运算符包括>,<,==,!==,>=,和<=。你会发现怎么等于号怎么是==这么写的呢?小学数学老师可没这么教过我。其实就是与变量赋值区别开。比如int a = 5,代表把5赋给a,已经用了咱小学数学用的等于号了,没办法,不能混淆,于是等于就变成了==。而等号前面加一个!就代表不等于。
关系运算符通常和第三种运算符,也就是逻辑运算符一起用。咱们一起讲。逻辑运算符包括三个关键字:与,或,非。与的意思是"同时",用&&表示;或的意思是"或者",用||表示;非的意思是"反过来",用!表示。
这三个关键字一般用在条件判断里,条件出现在这三个关键字的前后。条件判断咱们还没讲到,下篇讲。我们可以先预热一下,讲讲什么是条件。看我这里的例子:
这里if的意思是如果,括号里的就叫条件。咱们例子中需要条件判断来讲与或非,我就先给大家演示一下:
我现在程序里写if(a == b && a < 6),翻译过来就是如果a等于b并且a<6,打印出我是条件1;if(a > b || b ==5),翻译过来就是如果a大于b或者b等于5,打印出我是条件2;if(!(a>=b)),翻译过来就是a>=b反过来,那反过来就是a<b对不对?如果满足打印我是条件3。很明显,只有前两个条件满足,所以只打印前两句话。大家先好好看看这几个例子,下篇文章我还会详细讲条件判断。
这篇文章的源代码在Operators中。再留几个练习题吧:
1. 我们发现这节课讲的几个例子里的变量都是整型,那如果是两个字符相加呢?或者不一样类型的数相加呢?回想一下上节课讲的转换过程,然后计算下面几个算式:
1)20.8+5;
2)10+6%5-10;
3)(10+6.8)*3/6(要求结果四舍五入);
4)'A'+'C';
2. 刚刚我们只罗列了算数运算符的优先级,如果再算上关系运算符和逻辑运算符呢?请自己上网查找并总结。下篇文章我们讲java的流控机制。
本篇知识点及注意事项:
1. 变量之间可以进行四则运算;
2. a=a+b可以写成a+=b,同理也有-=,=,/=;
3. a=a+1可以写成a+=1,也可以写成a++或++a;
4. 只有++或--代表自增1或自减1,没有自乘1这么一说,*是错的。而且也没有自除1,//代表注释。