AI悦创

V1

2022/11/05阅读:11主题:凝夜紫

07-Java 中的运算符

你好,我是悦创。

原文首发:https://bornforthis.cn

1. 目录

  • 什么是运算符
  • 取模运算符
  • 整数的除法运算
  • 比较运算符和布尔运算符
  • 小括号运算符
  • 运算符优先级
  • 理解运算符优先级

2. 什么是运算符

  • 运算符对一个或者多个值进行运算,并得出一个运算结果。
  • 运算符的运算结果类型有的是固定的,有时候会根据被计算的值变化。比如两个 int 相加,结果的类型就是 int。两个 byte 相加,返回值的类型就是 int。
  • 混淆点:除赋值运算符外,运算符本身不会更改变量的值
public class demo {
    public static void main(String[] args) {
        byte a = 12;
        byte b = 1;
        int c = a + b;
        System.out.println(c);  // 13
    }
}
public class OprtNotChangeVariableValue {
    public static void main(String[] args) {
        int a = 100;
        System.out.println(a + 1);  // 101
        System.out.println(a);  // 100 显然 a 的值没有被修改

        a = a + 6;
        System.out.println(a);  // 106
        /*
        * 代码运行是先右边再左边的过程
        * */

    }
}

3. 取模运算 %

  • 用来计算余数
  • 负数也可以被取模
  • 负数也可以取模
  • 小数也可以取模
public class ModCalc {
    public static void main(String[] args) {
        int num = 10;
//        System.out.println(num % 2);  // 0  // 10 / 2 = 2...0 -> 0
//        System.out.println(num % -3);  // 1 // 10 / -3 = -3...1 -> 1
//        System.out.println(num % 4);  // 2  // 10 / 4 = 2...2 -> 1
//        System.out.println(num % 5);  // 0  // 10 / 5 = 2...0  -> 0
//        System.out.println(num % -6);  // 4  // 10 / -6 = -1...4
        //  如果把 10 改成 -10 呢?
        int num1 = -10;
        System.out.println(num1 % 2);  // 0
        System.out.println(num1 % -3); // -1
        System.out.println(num1 % 4);  // -2
        System.out.println(num1 % 5);  // 0
        System.out.println(num1 % -6); // -4
        // 结论:被取模的这个数字(num、num1)的正负,影响最后结果的正负
        // 小数的取模也是支持的,但是在我的职业生涯没有遇到过
    }
}

4. 整数的除法运算

接下来,讲解一下之前没有讲解的问题。

  • int 除以 int 还是 int,不会变成浮点数「两个 int 相乘也是不会变成 double 的」
public class IntegerDiv {
    public static void main(String[] args) {
        int a = 10;
        int b = 3;
        System.out.println(a / b);  // 3
        System.out.println(b / a);  // 0
        /*
         * 整数的除法运算,和数学中的除法运算是不一样的,从算数的角度来说
         * 10 / 3 得到的结果应该是 3.333333333...但是实际上,我们计算机 Java 得出来的结果是多少呢?——3
         * 这就是整数除法不一样的地方。
         * 这也就是为什么在之前加减乘除的课程中,除法时,我们要在其中一个整数添加上 .0
         * 【也就是说:10 / 3.0 才能得到我们想要的结果,如果只是 10 / 3 的话就只能得到 3】 */

    }
}

这就是我们刚刚说的,除法包括加法,它的运算结果类型,其实取决于被操作数字的数据类型的。比如:int,它和你运算之后结果应该是多少是没有关系的。 所以,要得出正确且是我们想要的结果,就得把其中一个数据改为浮点型。

public class IntegerDiv2 {
    public static void main(String[] args) {
        int a = 10;
        double b = 3.0;
//        double b = 3;
        System.out.println(a / b);  // 3.3333333333333335
    }
}

你要是把 a 变成浮点数也是可以的,反正其中有一个浮点数即可。另外的代码示例如下:

public class IntegerDiv3 {
    public static void main(String[] args) {
        int a = 10;
        float b = 3.0f// 用 double 也是可以的
        System.out.println(a / b); // 3.3333333
        System.out.println(b / a); // 0.3

    }
}

这样就是前面为什么要在两个整数做除法的是,在其中一个要加 .0 原因。「任意一个数是浮点数就可以」

5. 比较运算符和布尔运算符

5.1 比较运算符【双操作数或”多个“】

  • =

  • <
  • <=
  • !=
  • ==
public class CompareOprt {
    public static void main(String[] args) {
        int a = 10;
        int b = 15;
        int c = 10;

        System.out.println(a > b);
        System.out.println(a >= b);
        System.out.println(a < b);
        System.out.println(a <= b);
        System.out.println(a != b);

        System.out.println(a != c);
        System.out.println(a >= c);
        System.out.println(a <= c);
        System.out.println(a == b);
        System.out.println(a == c);

    }
}
public class CompareOprt {
    public static void main(String[] args) {

        byte a = 10;
        byte b = 15;
        byte c = 10;

        System.out.println(a > b); // false
        System.out.println(a >= b); // false
        System.out.println(a < b); // true
        System.out.println(a <= b); // true
        System.out.println(a != b); // true

        System.out.println(a != c); // false
        System.out.println(a >= c); // true
        System.out.println(a <= c); // true
        System.out.println(a == b); // false
        System.out.println(a == c); // true

    }
}

5.2 布尔运算符

  • ! 叫做 运算符,not 运算符。!true 是 false,!false 是 true。【单操作数】
  • & 叫做 运算符,and 运算符。true & true 是 true,true & false 是 false。
  • && 叫做 且且 运算符,andand 运算符。运算结果和 & 一样。
  • | 叫做 运算符,or 运算符。true | false 是 true,false | false 是 false,true | true 是 true。
  • || 叫做 或或 运算符,oror 运算符。运算结果和 | 一样。

这里强调一点,根据一个具有实际开发十几年经验的前辈所得来的经验,能用 且且、或或 运算符,尽量使用 且且、或或 ,具体原因先看如下代码:

public class BooleanOprt {
    public static void main(String[] args) {
        // 我们也可以使用比较运算符生成的 boolean 来进行比较。
        boolean a = true// 1 < 2
        boolean b = false// 1 > 2

        // // && 且且 (andand)
        // & 且 (and)
        // // | 或或 (oror)
        // | 或 (or)


        System.out.println(a && b); // false 
        System.out.println(a & b); // false
        System.out.println(a || b); // true
        System.out.println(a | b); // true

        System.out.println(a || (10 / 0 > 1)); // true
        // 这个 或或运算,Java 会对它进行一个优化。
        // 就是说:或或左边一旦是符合条件为真「也就是可以决定这个表达式为真」
        // 那么它就不会对后面的表达式进行运算了。
        System.out.println(a | (10 / 0 > 1)); // true
        // 单个或,就是说:不管现在条件是否成立,都要给我判断右边的情况「运算它们」。
        // 它对结果没有影响,所以上面我尝试引入一个错误,这样我们就能知道这个表达式到底有没有执行。
        // 10 / 0 > 1 本身就是一个错误的表达式
    }
}
public class BooleanOprt {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
//        我们也可以用比较出的结果来运算
//        boolean a = 1 < 2;
//        boolean b = 1 > 2;

        System.out.println(a && b);  // false
        System.out.println(a & b);  // false
        System.out.println(a || b);  // true
        System.out.println(a | b);  // true

        System.out.println(a || (10 / 0 > 1));
        /*对于或来说,后面这个值是 true 还是 false 是个不重要的,因为根据 or 运算规则,
        * 只要你有一个是 true 它的结果就会是 true。所以 java 对 oror 运算做出了一个优化,
        * 前面这个值已经能决定这个 or 逻辑运算的结果了,无论后面是啥,它都会是 true,那java 就
        * 不会对后面的表达式进行运算了。*/

        System.out.println(a | (10 / 0 > 1));
        /*单个的 or 就是告诉 java 你不要对我进行这层优化,你还要去算这个表达式后面是什么。
        * 虽然,它对结果没有影响,
        * 但是你还要去算它。虽然最终结果是看不出来,所以这个部分代码我故意引出一个错误,
        * 这样我们就知道这个表达式有没有执行,所以会出现如下报错:*/

        /*Exception in thread "main" java.lang.ArithmeticException: / by zero
 at BooleanOprt.main(BooleanOprt.java:15)*/


    }
}

6. 小括号运算符

小括号运算符内可以包含任何运算符,决定运算符的顺序。

public class ParentOprt {
    public static void main(String[] args) {
        int a = 10;
        int b = 88;
        boolean c = ((a + b) * a - 9 * (a + b)) == (a + b);  // true

        System.out.println(c);
    }
}

7. 运算符优先级

7.1 运算符优先级

  • ()
  • !
  • , /, %
  • +, -
  • , >=, <, <=

  • ==
  • !=
  • &, &&, |, ||
  • =

7.2 理解运算符,灵活记忆优先级

  • 为什么等号的优先级最低?「等号是个赋值运算,肯定是要等都运算完了再进行赋值的」
  • 为什么布尔运算符的优先级低于比较运算符?「因为布尔运算符操作的是布尔值,除了你直接写 true 或 false 之外,布尔值就是从比较出来的」
  • 为什么比较运算符的优先级比算数运算符低?「有可能你要比较的这个数是比较运算符比较出来的」

不要死记硬背,用括号让逻辑更清晰

8. 补充

public class AssignAndCalc {
    public static void main(String[] args) {

        int a = 10;

        a /= 2;

        System.out.println(a);

        a += 5;

        System.out.println(a);
    }
}

IED 技巧

  • 单行注释快捷键:CTRL + /
  • 多行注释快捷键:CTRL + SHIFT + /

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

分类:

后端

标签:

Java

作者介绍

AI悦创
V1

编程一对一教学,微信:Jiabcdefh