在学习变量的声明以及初始化时,我们就接触过操作符。当时使用等于号“=”将右边的数据赋值给等号左边的变量,等于号“=”也叫做赋值操作符。接下来我们先一起学习Java中的算术操作符。
和数学里面一样,对于数字Java也支持运算操作,比如加法(+)、减法(-)、乘法(*)、除法(/)、求余(%)。如果想计算两个整数2和3相加的结果,我们可以这样编写代码,
2+3
对于其他数学运算操作符,它们的用法也一样。我们可以像下面这样编写代码来打印运算操作的结果,
System.out.println(2+3);
System.out.println(2-3);
System.out.println(2*3);
System.out.println(2/3);
System.out.println(2%3);
如果大家运行上面这段代码,屏幕上会打印
5
-1
6
0
2
除了第四行代码的结果比较意外,其他运算的结果和我们心算的结果一样。大家肯定会疑惑,为什么“2/3”的结果不是一个分数(2/3)或者是一个在0.67左右的无限循环小数。
主要原因是在字面上Java将数字2和3看作整数,并且将它们的数学运算结果也当作整数来处理。与操作符相对应,这里的数字“2”和“3”也叫做操作数。在Java中,只要两个操作数都是整数,它们的各种数学运算结果也是整数。
现在再来看,尽管“2/3”的结果在数学上是一个小数,但是Java将其当作整数处理,因此小数部分会被直接截断舍弃,结果变成0。
那如果我们想要2除以3的结果以小数形式显式,又应该怎样来编写代码呢?这很简单,只要操作符两边的操作数有一个是小数,那么其结果也就是小数。
System.out.println(2.0/3);
System.out.println(2/3.0);
System.out.println(2.0/3.0);
如果大家运行这段代码,我们的屏幕上就会打印
0.6666666666666666
0.6666666666666666
0.6666666666666666
对于浮点数除了支持除法运算,也支持加、减、乘以及求余。
System.out.println(2.5+3.15);
System.out.println(2.5-3.15);
System.out.println(2.5*3.15);
System.out.println(2.5%3.15);
运行上面这段代码,我们的屏幕上会显式
5.65
-0.6499999999999999
7.875
2.5
除了第二行代码的结果非常意外,其他运算的结果都和我们手动计算的结果一样。那这又是什么原因呢?这个结果主要是由数据在计算机内存中的表示缺陷导致的,无论是整数还是小数,它们在内存中都是由一系列“0-1”二进制符号表示的。
可能“2.5-3.15”这个浮点数运算不足以直观地说明确实存在数据表示缺陷这个问题,如果大家运行下面这行代码,
System.out.println(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1);
屏幕上会打印,
0.9999999999999999
非常惊讶地是,这个结果并不是1.0。因此大家需要注意,电脑在表示浮点数时存在误差。
前面我们使用println()来直接打印如“2+3”这样的算式的结果,与先前使用println()打印数字、字符串或者变量的用法不同。在Java中,类似于“2+3”这样的算式常常叫做表达式,更准确地讲应该叫做运算表达式。程序在执行表达式时会产生一个结果,这个结果可以直接使用,比如使用println()打印出来,或者将其作为另外一个表达式的操作数,甚至还可以将其赋值给某个变量。
int result = 2+3;
程序在执行上面这行代码时,会先计算表达式“2+3”,然后将结果5赋值给整数类型变量result。
对于赋值操作符=,和前面这行代码一样,除了可以将一个表达式直接赋值给某个变量,甚至可以将一个变量赋值给另外一个变量。
int aInt = 12;
int anotherInt = aInt;
上面这段代码中,我们首先用驼峰命名规范声明了一个整型变量“aInt”,并赋予初始值12。接着声明了另外一个整型变量“anotherInt”,并将变量aInt的值赋给新变量,作为其初始值。
像这样编写代码是合法的。如果大家运行下面这段代码,
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
电脑屏幕上会显式
aInt: 12
anotherInt: 12
值得注意的是,将变量aInt的值赋给新变量anotherInt时,本质上是将aInt的值12复制一份,然后再赋值给变量anotherInt。这两个变量是没有关联的,也就是说更改其中一个变量,并不会影响另外一个变量。
比如我们将变量anotherInt的当前值翻倍,像这样,
anotherInt = 24;
程序执行完这行代码后,变量anotherInt的最新值就变成了24,但是变量aInt的值保持不变,仍然为12。我们可以再一次打印这两个变量,
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
再次运行上面这段代码后,我们的屏幕上会显式
aInt: 12
anotherInt: 24
除了像前面那样直接将数字24赋给变量anotherInt,也可以像下面这样编写代码来将其当前值翻倍,
anotherInt = anotherInt * 2;
程序在执行这行代码时,会首先计算右边的表达式“anotherInt * 2”,然后将结果再次赋给变量anotherInt。这里也说明了,表达式里面的操作数除了可以是数字,可以是另外一个表达式,还可以是一个变量。
上面这行代码还可以改写,就需要用到我们接下来会学习的快捷赋值操作符。
anotherInt *= 2;
假设变量anotherInt的当前值为24,运行这行代码后其值会从24翻倍到48。这里的符号“*=”就是乘法操作的快捷赋值操作符。程序在执行这行代码时,会从内存里面取出变量anotherInt的当前值24,接着将其乘以2,最后将计算结果48再次通过赋值操作=写入内存里面,所有变量anotherInt的最新值就变了48。
类似地,对于其他基本运算操作,Java也提供了对应的快捷赋值操作符,如加法(+=)、减法(-=)、除法(/=)、求余(%=)。
如果大家运行这段代码
anotherInt = 12;
anotherInt += 2;
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt -= 2;
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt /= 2;
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt %= 2;
System.out.print("anotherInt: ");
System.out.println(anotherInt);
我们的屏幕上将会显式,
anotherInt: 14
anotherInt: 10
anotherInt: 6
anotherInt: 0
可以看到,对于代码
anotherInt += 2
其等效于
anotherInt = anotherInt + 2
对于其他操作
anotherInt -= 2
anotherInt /= 2
anotherInt %= 2
依次分别等效于
anotherInt = anotherInt - 2
anotherInt = anotherInt / 2
anotherInt = anotherInt % 2
如果将一个数字增加或者减少一个单位,我们除了可以使用加法的快捷操作符(+=)和减法的快捷操作符(-=),还可以使用自增操作符(++)和自减操作符(–)。
aInt = 10;
System.out.println(aInt);
aInt += 1; // 11
System.out.println(aInt);
aInt++; // 12
System.out.println(aInt);
aInt -= 1; // 11
System.out.println(aInt);
aInt--; // 10
System.out.println(aInt);
如果大家运行上面这段代码,屏幕上会打印
10
11
12
11
10
值得注意的是,在Java中自增操作符(++)、自减操作符(–)可以位于操作数的前面或者后面,但是它们的背后意义不一样。
System.out.println(aInt++);
System.out.println(aInt);
假设变量aInt现在的值为10,运行上面这段代码,我们的屏幕上将会打印
10
11
对于第一行代码,其本质上等效于下面两行代码,
System.out.println(aInt);
aInt = aInt + 1;
也就是说当自增操作符位于操作后面时,程序会先使用变量的当前值,然后才会将其增加1;当自减操作符位于后面时,逻辑也是一样的,程序也会先使用其当前值,接着将其减少1。
如果像这样编写代码,
System.out.println(++aInt);
System.out.println(aInt);
运行程序后我们的屏幕上会打印
11
11
同样地,第一行代码其实等效于下面两行代码,
aInt = aInt + 1;
System.out.println(aInt);
即当自增操作符位于操作数前面时,程序会先将其当前值增加1,然后使用这个变量的最新结果;对于自减操作符位于前面的情况也是一样。
对于其他操作符的用法,在接下来的教程里面我们再学习,这里贴上本节教程的完整代码。
public class OperatorsDemo {
public static void main(String[] args) {
System.out.println(2+3);
System.out.println(2-3);
System.out.println(2*3);
System.out.println(2/3);
System.out.println(2%3);
System.out.println("======================");
// 浮点数除法
System.out.println(2.0/3);
System.out.println(2/3.0);
System.out.println(2.0/3.0);
System.out.println("======================");
System.out.println(2.5+3.15);
System.out.println(2.5-3.15);
System.out.println(2.5*3.15);
System.out.println(2.5%3.15);
System.out.println("======================");
// 数据表示误差
System.out.println(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1);
System.out.println("======================");
int result = 2+3;
System.out.println(result);
System.out.println("======================");
int aInt = 12;
int anotherInt = aInt;
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
System.out.println("======================");
anotherInt = 24;
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
System.out.println("======================");
anotherInt = 12;
anotherInt = anotherInt * 2;
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
System.out.println("======================");
anotherInt *= 2;
System.out.print("aInt: ");
System.out.println(aInt);
System.out.print("anotherInt: ");
System.out.println(anotherInt);
System.out.println("======================");
anotherInt = 12;
anotherInt += 2; // anotherInt = anotherInt + 2
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt -= 2; // anotherInt = anotherInt - 2
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt /= 2; // anotherInt = anotherInt / 2
System.out.print("anotherInt: ");
System.out.println(anotherInt);
anotherInt = 12;
anotherInt %= 2; // anotherInt = anotherInt % 2
System.out.print("anotherInt: ");
System.out.println(anotherInt);
System.out.println("======================");
aInt = 10;
System.out.println(aInt);
aInt += 1; // 11
System.out.println(aInt);
aInt++; // 12
System.out.println(aInt);
aInt -= 1; // 11
System.out.println(aInt);
aInt--; // 10
System.out.println(aInt);
System.out.println("======================");
System.out.println(aInt++);
System.out.println(aInt);
System.out.println("======================");
aInt = 10;
System.out.println(++aInt);
System.out.println(aInt);
System.out.println("======================");
aInt = 10;
System.out.println(aInt--);
System.out.println(aInt);
System.out.println("======================");
aInt = 10;
System.out.println(--aInt);
System.out.println(aInt);
}
}