常见操作符(上篇)

在学习变量的声明以及初始化时,我们就接触过操作符。当时使用等于号“=”将右边的数据赋值给等号左边的变量,等于号“=”也叫做赋值操作符。接下来我们先一起学习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);
    }
}

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注