草庐IT

Java基础之运算符

冬璃 2023-04-18 原文

Java基础之运算符

目录

1.1 运算符介绍

1.1.1 运算符介绍

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等,运算符可分为:

1)算术运算符

2)赋值运算符

3)关系运算符 [比较运算符]

4)逻辑运算符

5)位运算符 [需要二进制]

6)三元运算符

1.2 算术运算符

1.2.1 介绍

算术运算符是对数值类型的变量进行运算的,在Java程序中使用非常多

1.2.2 算术运算符一览表

1.2.3 代码演示

public class ArithmeticOperator {
    /**
     * 演示算数运算符的使用
     */
    public static void main(String[] args) {
        System.out.println(10 / 4); //2   两个数都是int类型,结果为int类型
        System.out.println(10.0 / 4); //2.5  有一个为double类型,结果为double类型

        double d = 10 / 4; //10 / 4 为int类型,会自动转换为double类型
        System.out.println(d); //2.0

        // % 取余(取模)
        //在Java中 % 的本质是:a % b = a - a / b * b
        //-10 % 3 => -10 - (-10) / 3 * 3 = -10 + 9 = -1
        //10 % -3 => 10 - 10 / (-3) * (-3) = 10 - 9 = 1
        //-10 % -3 => -10 - (-10) / (-3) * (-3) = -10 + 9 = -1
        System.out.println(10 % 3); // 1
        System.out.println(-10 % 3); // -1
        System.out.println(10 % -3); // 1
        System.out.println(-10 % -3); // -1

        // ++的使用
        /*
            作为语句独立使用:
            前++ 和 后++ 独立使用时都等价于 i = i + 1;
         */
        int i = 10;
        i++; //自增  等价于 i = i + 1; => i = 11;
        ++i; //自增  等价于 i = i + 1; => i = 12;
        System.out.println("i=" + i); //12
        /*
            作为表达式使用:
            前++: ++i 先自增后赋值
            后++: i++ 先赋值后自增
         */
        int j = 8;
        int k = ++ j; //等价于 j = j + 1; k = j;
        int n = j ++; //等价于 n = j; j = j + 1;
        System.out.println("k=" + k + "n=" + n + "j=" + j); // k=9  n=9  j=10
    }
}

1.2.4 细节说明

  • 对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如: int x = 10 / 3; 结果为3。
  • 当对一个数取余(取模),可以等价a % b = a - a / b * b ,根据这个公式,我们可以看到取余的一个本质运算。
  • 当自增当做一个独立语言使用时,不管是++i 还是 i++ 都是一样的,等价于 i = i + 1。
  • 当自增当做一个表达式使用时,前++: ++i 先自增后赋值;后++: i++ 先赋值后自增

1.2.5 面试题

1)面试题一

int i = 1;

i = i++;

System.out.println(i);

结果为多少?为什么?

  • i = i++; 后++ 先赋值,后自增。这一过程中使用了临时变量来存放i的值

    (1)int temp = i; // temp=1

    (2)i = i + 1; // i=2

    (3)i = temp; // i=1

    所以最后结果为:i = 1

2)面试题二

int i = 1;

i = ++i;

System.out.println(i);

结果为多少?为什么?

  • i = ++i; 前++ 先自增,后赋值。这一过程中使用了临时变量来存放i的值

    (1)i = i + 1; // i=2

    (2)int temp = i; // temp=2

    (3)i = temp; // i=2

    所以最后结果为:i = 2

1.2.6 小练习

1)看看输出是什么?

  int i1 = 10; 
  int i2 = 20; 
  int i = i1++; 
  System.out.print("i="+i); //10 
  System.out.println("i2="+i2); //20 
  i = --i2; 
  System.out.print("i="+i); //19 
  System.out.println("i2="+i2); //19
  • 步骤如下:

​ i1 = 10;

​ i2 = 20;

​ i = i1++; // 先赋值,后自增 i=10,i1=11,i2=20

​ i = --i2; // 先自减,后赋值 i2=19,i=19

2)假如还有 59 天放假,问:合 xx 个星期零 xx 天

public class ArithmeticOperatorExercise {
    public static void main(String[] args) {
        //假如还有 59 天放假,问:合 xx 个星期零 xx 天
        /*
             1)需求:
               假如还有 59 天放假,问:合 xx 个星期零 xx 天
             2)思路分析:
               使用int型变量来存放天数
               一星期有7天
               天数除以7 可得星期数
               天数对7取余 可得零几天
             3)走代码:
         */
        int days = 59;
        int weeks = days / 7;
        int leftDays = days % 7;
        System.out.println(days + "天合" + weeks + "个星期零" + leftDays + "天");
    }
}

3)定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:

5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。 [234.5]

public class ArithmeticOperatorExercise {
    public static void main(String[] args) {     
        /*
             1)需求:
               定义一个变量保存华氏温度,请求出华氏温度对应的摄氏温度。
             2)思路分析:
               定义一个double变量fahrenheit保存华氏温度
               根据公式计算对应的摄氏温度
               定义一个double变量Celsius保存摄氏温度
             3)走代码:
         */
        double fahrenheit = 1234.6;
        double Celsius = 5.0 / 9 * (fahrenheit - 100);
        System.out.println("华氏温度" + fahrenheit + " 对应的摄氏温度="+ Celsius);
    }
}

1.3 关系运算符(比较运算符)

1.3.1 介绍

1)关系运算符的结果都是boolean类型,要么是true,要么是false。

2)关系表达式经常用在if结构的条件或循环结构的条件中。

1.3.2 关系运算符一览表

1.3.3 案例演示

public class RelationalOperator { 
    //编写一个 main 方法 
    public static void main(String[] args) { 
        int a = 9; // 开发中,不可以使用 a, b 
        nt b = 8; 
        System.out.println(a > b); //T 
        System.out.println(a >= b); //T 
        System.out.println(a <= b); //F 
        System.out.println(a < b);//F 第 63页
        System.out.println(a == b); //F 
        System.out.println(a != b); //T 
        boolean flag = a > b; //T 
        System.out.println("flag=" + flag); 
    } 
}

在开发中不可以使用a、b这种简单的字符来命名变量

1.3.4 细节说明

1)关系运算符的结果都是boolean类型,要么是true,要么是false。

2)关系运算符组成的表达式,我们称为关系表达式。

3)比较运算符"= ="不能误写成"="。

1.4 逻辑运算符

1.4.1 介绍

用于连接多个条件(多个关系表达式),最终的结果也是一个boolean值。。

1.4.2 逻辑运算符一览表

1)短路与 &&,短路或 ||,取反 !

2)逻辑与 &,逻辑或 |,逻辑异或 ^

3)运算规则说明:

  • a & b:& 叫逻辑与。当a和b同时为true,则结果为true,否则为false

  • a && b:&& 叫短路与。当a和b同时为true,则结果为true,否则为false

  • a | b:| 叫逻辑或。当a和b有一个为true,则结果为true,否则为false

  • a || b:|| 叫短路或。当a和b有一个为true,则结果为true,否则为false

  • !a:叫取反。当a为true,则结果为false;当a为false,则结果为true

  • a ^ b:叫逻辑异或。当a和b不同时,则结果为true,否则为false

1.4.3 && 和 & 基本规则

名称 语法 特点

短路与&& 条件1 && 条件2 当两个同时为true,则结果为true,否则为false。如果条件1为false,则不判断条件2,结果为false

逻辑与& 条件1 & 条件2 当两个同时为true,则结果为true,否则为false.如果条件1为false,继续判断条件2,结果为false

1.4.4 && 和 & 案例演示

public class LogicOperator01 {
    public static void main(String[] args) {
        // &&短路与 和 &逻辑与 演示
        /*
              && 规则: 两个条件都为true,结果为 true,否则为 false
              & 规则: 两个条件都为true,结果为 true,否则为 false
         */
        // &&短路与
        int age =50;
        if(age > 20 && age < 90){
            System.out.println("0k100");
        }
        // &逻辑与
        if(age > 20 & age < 90) {
            System.out.println("ok200");
        }
        //区别
        int a = 4;
        int b = 9;
        //对于&&短路与而言,如果第一个条件为 false ,后面的条件不再判断
        //对于&逻辑与而言,如果第一个条件为 false ,后面的条件仍然会判断
        if(a < 1 & ++b < 50) {
            System.out.println("ok300");
        }
        System.out.println("a=" + a + " b=" + b);// a=4  b=10
    }
}

1.4.5 && 和 & 使用区别

  1. &&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高

  2. & 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低

  3. 开发中, 我们使用的基本是使用短路与&&, 效率高

1.4.6 || 和 | 基本规则

名称 语法 特点

短路或|| 条件1 && 条件2 当两个中有一个为true,则结果为true,否则为false。如果条件1为true,则不判断条件2,结果为true

逻辑或| 条件1 & 条件2 当两个中有一个为true,则结果为true,否则为false.如果条件1为true,继续判断条件2,结果为true

1.4.7 || 和 | 案例演示

public class LogicOperator02 {
    public static void main(String[] args) {
        // ||短路或 和 |逻辑或 演示
        /*
             ||短路或: 两个条件中只要有一个成立,结果为 true,否则为 false
             |逻辑或: 两个条件中只要有一个成立,结果为 true,否则为 false
         */
        int age = 50;
        if(age > 20 || age < 30) {
            System.out.println("ok100");
        }
        //&逻辑与使用
        if(age > 20 | age < 30) {
            System.out.println("ok200");
        }
        //区别
        int a = 4;
        int b = 9;
        //对于||短路或而言,如果第一个条件为 true ,后面的条件不再判断
        //对于|逻辑或而言,如果第一个条件为 true ,后面的条件仍然会判断
        if( a > 1 || ++b > 4) {
            // 可以换成 | 测试
            System.out.println("ok300");
        }
        System.out.println("a=" + a + " b=" + b); //4 9

    }
}

1.4.8 || 和 | 使用区别

  1. ||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高

  2. | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低

  3. 开发中,我们基本使用 ||

1.4.8 ! 取反基本规则

名称 语法 特点

! 非(取反) ! 条件 如果条件本身成立,结果为 false,否则为 true

1.4.9 ! 案例演示

public class InverseOperator {
    public static void main(String[] args) {
        // ! 操作是取反  T->F  F->T
        System.out.println(60 > 20); //T
        System.out.println(!(60 > 20)); //F

        // a^b:逻辑异或,当a和b不同时,则结果为true,否则为false
        boolean b = (10 > 1) ^ ( 3 > 5);
        System.out.println("b=" + b); //T
    }
}

1.4.10 ^ 基本规则

a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false

^逻辑异或,System.out.println( (4 < 1) ^ (6 > 3) );

1.4.11 练习题 写出输出结果

        int x = 5;
        int y = 5;
        if(x++ == 6 & ++y == 6){ //①
            x = 11;  //②
        }
        System.out.println("x=" + x + "y=" + y);// x=6,y=6

讲解:

​ 在程序执行到①的时候,x++是后++,x先与6进行比较,结果为false,x加1之后x=6。

​ 逻辑与第一个为false还要继续判断第二个条件。++y是先++,y先加1之后y=6,y与6进行判断,结果为true。

​ false & true 结果为false,不执行if语句里面的内容。

        int x = 5;
        int y = 5;
        if(x++ == 6 && ++y == 6){ //①
            x = 11; //②
        }
        System.out.println("x=" + x + "y=" + y);// x=6,y=5

讲解:

​ 在程序执行到①的时候,x++是后++,x先与6进行比较,结果为false,x加1之后x=6。

​ 短路与第一个条件为false,不用判断第二个条件,y没有进行自加操作y=5。

        int x = 5;
        int y = 5;
        if(x++ == 5 | ++y == 5){ //①
            x = 11; //②
        }
        System.out.println("x=" + x + "y=" + y);// x=11,y=6

讲解:

​ 在程序执行到①的时候,x++是后++,x先与5进行比较,结果为true,x加1之后x=6。

​ 逻辑或第一个为true还要继续判断第二个条件。++y是先++,y先加1之后y=6,y与5进行判断,结果为false。

​ true | false 结果为true,执行if语句里面的内容②,x=11。

        int x = 5;
        int y = 5;
        if(x++ == 5 || ++y == 5){ //①
            x = 11; //②
        }
        System.out.println("x=" + x + "y=" + y);// x=11,y=5

讲解:

​ 在程序执行到①的时候,x++是后++,x先与5进行比较,结果为true,x加1之后x=6。

​ 短路或第一个为true不需要继续判断第二个条件。

​ 执行if语句里面的内容②,x=11。y没有进行自加操作y=5。

        boolean x = true;
        boolean y = false;
        short z = 46;
        if((z++ == 46) && (y = true)) z++;  //①
        if((x = false) || (++z == 49)) z++;  //②
        System.out.println("z=" + z);  //z=50

讲解:

​ 在程序执行到①的时候,z++是后++,z先与46进行比较,结果为true,z加1之后z=47,判断条件二,y被赋值为true。执行z++操作,z=48.

​ 在程序执行到②的时候,x=false为false,继续判断第二个条件,++z是先++,z加1之后z=49。然后再执行z++操作,z=50.

1.5 赋值运算符

1.5.1介绍

赋值运算符就是将某个运算后的值,赋给指定的变量

1.5.2 赋值运算符的分类

  • 基本赋值运算符 =:int a = 10;

  • 复合赋值运算符

    +=,-=,*=,/=,%= 等

    举例说明:

    a += b; <==> a = a + b;

    a -= b; <==> a = a - b;

1.5.3 赋值运算符的特点

1)运算顺序从右往左 int num = a + b + c;

2)赋值运算符的左边 只能是变量,右边可以是变量、表达式、常量

3)复合赋值运算符等价于下面的效果

a += 3 等价于 a = a + 3;

4)复合赋值运算符会进行类型转换

  byte b = 3;
  b += 2; // 等价于 b = (byte)(b + 2);  如果直接写成b=b+1,编译会报错
  b++; // b = (byte)(b + 1);

1.6 三元运算符

1.6.1 基本语法

条件表达式 ? 表达式1 : 表达式2;

运算规则:

1)如果条件表达式为true,运算后的结果是表达式1;

2)如果条件表达式为false,运算后的结果是表达式2;

1.6.2 使用细节

  1. 表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)

  2. 三元运算符可以转成 if--else 语句

​ int res = a > b ? a++ : --b;

​ 可以转换成:

​ if(a > b) res = a++;

​ else res = --b;

public class TernaryOperator { 
    public static void main(String[] args) { 
        //表达式 1 和表达式 2 要为可以赋给接收变量的类型 //(或可以自动转换/或者强制转换) 
        int a = 3; 
        int b = 8; 
        int c = a > b ? (int)1.1 : (int)3.4;//可以 
        double d = a > b ? a : b + 3;//可以,满足 int -> double
    } 
}

1.7 运算符的优先级

可以记住口诀:后单四移关,等位逻三赋

单目运算符,四则运算符,移位运算符,关系运算符,等值运算符,位运算符,逻辑运算符,三目运算符,赋值运算符

有关Java基础之运算符的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐