Skip to content

表达式

大多数的逻辑行都包含表达式,如计算面积就是一个简单的表达式,表达式可以分解为运算符(操作符)与操作数,运算符是为了完成某个功能,它们由如+-这样的符号或者其它特定的关键字表示,运算符需要数据来进行计算,这样的数据被称为操作数。在计算面积的示例中,3和4为操作数,而area则称为表达式,如:

java
package cc.neeo.operator;

public class OperatorDemo1 {
    public static void main(String[] args) {
        int length = 3;
        int width = 4;
        int area = length * width;
        System.out.println(area);  // 12
    }
}

我们将长和宽通过变量保存起来,然后通过表达式来计算它的面积,计算的结果保存在area中,通过打印area输出结果。 由运算符和表达式组成了程序的基本结构。本节我们主要讲解常用的运算符与参与运算的表达式。

算术运算符

算数运算符和我们数学上计算的符号使用是一致的,java支持的算数运算符.

java
package cc.neeo.operator;

public class OperatorDemo1 {
    public static void main(String[] args) {
        print(10, 3);
    }
    public static void print(int a, int b) {
        // 1. 列出java中的算术运算符
        System.out.println(a + b);  // 加法
        System.out.println(a - b);  // 减法
        System.out.println(a * b);  // 乘法
        // 除法,这里的a和b都是整数,数学上相除结果是3.333.....
        // 但java中不是这样的,java中,表达式的最终结果类型,取决于最高类型,a和b都是整型
        // 所以a/b的结果是也是整型3
        System.out.println(a / b);  // 3
        // 想要得到小数,就先转下类型,让其最高类型是浮点型
        System.out.println((double)a / b);
        System.out.println(a % b);  // 取余
    }
}

注意,两个整数相除,其结果一定是整数,因为最高类型是整数.

运算符+在java中的特殊用途

再参与字符串远算的时候,作为连接符,或者拼接符来用的.最终结果依然是个字符串.

java
int length = 3;
int width = 4;
int area = length * width;
System.out.println("面积为: " + area);  // 面积为: 12

那问题来了,什么时候是运算,什么时候是连接呢?其规则就是"能算则算,不能算就是连接在一起".

自增自减运算符

++a,a++,--a,a--这四个用于对于变量a的自增和自减.区别是:

  • a++是后缀自增运算符,即:

    • 它首先返回变量 a 的当前值。
    • 然后才将 a 的值增加 1。
  • ++a是前缀自增运算符,即:

    • 它首先将变量 a 的值增加 1。
    • 然后返回增加后的值。
  • a--是后缀自减运算符,即:

    • 它首先返回变量 a 的当前值。
    • 然后才将 a 的值减去 1。
  • --a是前缀自减运算符,即:

    • 它首先将变量 a 的值减去 1。
    • 然后返回减完之后的值。

注意,自增自减只能作用于变量,而不能作用于字面量,即你能a++,不能2++.

首先,自增自减单独使用运算符放到变量左右是没区别的,即没有变量赋值的情况.

java
int a = 10;
// 直接加加减减,没有变量接收加减之后的结果,都可以理解为是 a = a + 1,或者a = a - 1
a++;
++a;
System.out.println(a);  // 值是12

a--;
--a;
System.out.println(a);  // 值是10

但是,如果有变量接收或在表达式中,或者同时具有其它操作的时候,,运算符放到变量左边和右边会有明显的区别:

java
// 先来看自增的情况
int a = 10;
int res1 = a++;
// 下面的打印,a的值是11这是肯定的,因为最终是加一了
// 但是res1的值是10,因为其过程是先把a赋值给res1,然后再加一,所以res1的值还是10
System.out.println("a: " + a + "\tres1: " + res1);  // a: 11	res1: 10

// 下面的打印,a的值是12,这是肯定的,因为最终是加一了
// res2的值也是12, 因为其过程是先加一,然后再赋值给res2
int res2 = ++a;
System.out.println("a: " + a + "\tres2: " + res2);  // a: 12	res2: 12

System.out.println("------------------------------------------------------");
// 自减的情况和自增一样
// 程序运行到这里,a的值是12
int res3 = a--;
// 此时打印的a的结果是11,这是肯定的,因为最终是做了一次自减操作
// 但是res3的值是12,因为其过程是先把a赋值给res3,然后再减一,所以res3的值还是12
System.out.println("a: " + a + "\tres3: " + res3);  // a: 11	res3: 12
int res4 = --a;
// 程序运行到这里,a的值是10,是因为减减a是先自减再把a的结果赋值给res4
// 所以res4的值也是10
System.out.println("a: " + a + "\tres4: " + res4);  // a: 10	res4: 10

来个表达式操作应用,下面res的值是多少?

java
int a = 1;
// 此时 --a 使 a 变为 0 并返回 0 参与加法运算, 然后 a-- 使 a 变为 -1 但返回 0 再参与加法运算, 结果是 0 + 0 = 0
int res = --a + a--; 

int a = 1;
// 此时 ++a 使 a 变为 2 并返回 2 参与加法运算, 然后 a++ 使 a 变为 3 但返回 2 再参与加法运算, 结果是 2 + 2 = 4
int result = ++a + a++;