day05_Java中的运算符

在Java中提供了丰富的运算符  

  • 其按照功能分算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符
  • 按照操作数个数分一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目运算符)

我们又称用运算符连接起来的式子就是表达式。下面我们来具体学习一下每个运算符的作用吧。

算数运算符

 代码示例

/*
被除数 ÷ 除数 = 商 ......    余数
 */
public class Demo01Operator {
    public static void main(String[] args) {
        int a = 10;
        int b = 4;

        // + - * 和我们小学的规则一样
        System.out.println(a + b); //14
        System.out.println(a - b);//6
        System.out.println(a * b);//40

        //2个整数相除,结果就是商,整数相除 不保留小数,如果想要显示小数 使用浮点类型计算
        System.out.println(a / b);//2

        //int * double / int ==> double /    int ==> double / double ==> double
        System.out.println((a * 1.0) / b);// 2.5
   /*
    %运算符: 取余数(模)运算符
    作用:
        1.判断数字的奇偶性:
            数字%2 结果是0 说明数字是偶数
            数字%2 结果不是0 说明数字是奇数

        2.判断一个数字是否能够被另外一个数字整除
            结果为0: 说明可以整除
            结果不为0: 说明不可以整除
    */
        //结果是0 说明10是偶数,结果是 1 说明11是奇数
        System.out.println(10 % 2);//0 
        System.out.println(11 % 2);//1
        
        //结果是0 说明100可以被25整除,否则说明100不可以被26整除
        System.out.println(100 % 25);//0 
        System.out.println(100 % 26);//22 
    }
}

注意事项:

  • Java中,整数使用以上运算符,无论怎么计算,也不会得到小数。因为最高类型是整数
  • 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
  • / 和%的区别:两个整数做除法,/取结果的商,%取结果的余数。取模的结果只和被除数的正负号相同。
  • 除数不能为0,如果除数为0,程序运行时会抛出数学异常

案例:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台

import java.util.Scanner;

public class Demo04Operator {
    public static void main(String[] args) {
        // 1:使用Scanner键盘录入一个三位数
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个三位数");
        int num = sc.nextInt();
        // 2:个位的计算:数值 % 10
        int ge = num % 10;                        // 123 % 10 = 3
        // 3:十位的计算:数值 / 10 % 10
        int shi = num / 10 % 10;                // 123 / 10 = 12        12 % 10 = 2
        // 4:百位的计算:数值 / 100
        int bai = num / 100;                    // 123 / 100 = 1
        // 5:将个位, 十位, 百位拼接上正确的字符串, 打印即可
        System.out.println("整数:"+num+" 个位为:" + ge);
        System.out.println("整数:"+num+" 十位为:" + shi);
        System.out.println("整数:"+num+" 百位为:" + bai);

    }
}

​“+”号的两种用法

  • 第一种:对于+两边都是数值的话,+就是加法的意思。char类型参与算术运算,使用的是计算机底层对应的十进制数值。
  • 第二种:对于+两边至少有一边是字符串得话,+就是拼接的意思。字符串可以使用 +号, 跟任意数据类型拼接,结果就是字符串。当连续进行“+”操作时,从左到右逐个执行。能算则算,不能算则拼接在一起。变量运算是取其中保存的值。

代码示例

public class Demo02Operator {
    public static void main(String[] args) {
        
        //数学中的加法运算(数字相加,字符相加)
        System.out.println(5 + 5);// 10
        /*
            int + char ==> int + int ==> int
            需要:
                char ==> int 查看ASCII码表 'A'对应65
        */
        System.out.println(5 + 'A');// 70
        /*
            自动类型转换中:
                byte/short/char类型,只要参加运算,会自动转换为int类型
            char + char ==> int + int ==> int
            需要:
                char ==> int 查看ASCII码表 'A'对应65
                char ==> int 查看ASCII码表 'B'对应66
        */
        System.out.println('A' + 'B');// 131

        
        //字符串的拼接(把两个字符串连在一起),从左向右计算
        System.out.println("Hello" + "World"); //HelloWorld

        //先计算"5+5="+5: 此处+号代表字符串的连接 结果是"5+5=5"
        //然后"5+5=5"+5: 此处+号代表字符串的连接 结果是"5+5=55"
        System.out.println("5+5=" + 5 + 5);//5+5=55

        // 可以使用小括号提高运算的等级,所以先计算5+5 结果10
        //然后"5+5="+10: 此处+号代表字符串的连接 结果是"5+5=10"
        System.out.println("5+5=" + (5 + 5));//5+5=10

    }
}

自增自减运算符

  • ++ 运算,变量自己的值加1反之,-- 运算,变量自己的值减少1
  • ++ 和 -- 既可以放在变量的后边,也可以放在变量的前边。
  • 自增自减运算符只能操作变量,不能操作常量

单独使用(推荐使用)

变量在单独运算的时候,变量前++和变量后++,是没有任何区别的;

  • 变量前++ :例如 ++a
  • 变量后++ :例如 a++

代码示例

public static void main(String[] args) {
        // 定义一个int类型的变量a
        int a = 3;
        //++a;
        a++;
        // 无论是变量前++还是变量后++,结果都是4
        System.out.println(a);
    }

复合使用

和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就产生了不同。

  • 变量前++ :放在变量的前面,先对变量进行+1,再拿变量的值进行运算
  • 变量后++ :放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1
public class Demo04Operator {
    public static void main(String[] args) {
        // 其他变量放在一起使用
        int x = 3;
        //int y = ++x;  y的值是4,x的值是4,

        // y的值是3,x的值是4
        int y = x++;

        System.out.println(x);//4
        System.out.println(y); //3


        // 和输出语句一起
        int z = 5;

        System.out.println(++z);//6
        System.out.println(z++);// 6
        System.out.println(z);//7

        int a = 1;
        //(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1
        a = a++;
        System.out.println(a);//1

    }
}

实际开发中强烈建议不要写这样的代码

public static void main(String[] args) {
        int x = 4;
        /*
            表达式(x++)+(++x)+(x*10)是从左到右计算的
            先计算(x++): 因为++在后面,先使用x的值4,然后x的值增加,变成5
            4 + (++x)+(x*10)
            接着计算(++x): 因为++在前面,先把x的值增加1,x变成6,然后再使用6
            4 + 6+(x*10)
            接着计算x*10 -->  6*10 结果: 60
            4 + 6 + 10 结果: 70
        */
        int y = (x++) + (++x) + (x * 10);
        System.out.println(x);//6
        System.out.println(y);//70

    }

赋值运算符

  • 赋值运算符,就是将符号右边的值,赋给左边的变量。 所有的赋值运算符的左边一定是一个变量,不能是常量。
  • 基本赋值运算符,就是“=”。
int a = 10; // 先看“=”右边,把数据10赋值给左边的变量a存储。

扩展赋值运算符

 代码示例

/*
    基本赋值运算符: =
    复合赋值运算符:
        +=        a+=b        a=a+b
        -=        a-=b        a=a-b
        *=        a*=b        a=a*b
        /=        a/=b        a=a/b
        %=        a%=b        a=a%b
*/
public class Demo03Operator {
    public static void main(String[] args) {
        //基本赋值运算符
        int a = 10, b = 20;

        //复合赋值运算符:
        a += b;//a = a + b
        System.out.println(a);//30
        System.out.println(b);//20

        int c = 30, d = 20;
        c %= d;//c = c % d

        System.out.println(c);//10
        System.out.println(d);//20

        short s = 1;
        /*
            +=,-=,/=,*=,%= 运算结果的数据类型和左侧变量的数据类型不一致,隐藏强制类型转换
        */
        s += 1;//s = (short)(s + 1);
        System.out.println(s);//2

    }
}

注意事项:

  • 扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换。  
  • 整数常量只要不超出所赋值的整数变量的取值范围,可以直接赋值,内部隐藏强制类型转换,
  • 扩展的赋值运算符可能发生溢出或损失精度。 
  • 运算的顺序把右边的整个表达式先算完,才会做最后的赋值操作。

例如:

      int j = 1;
        j += ++j * j++;//相当于  j = j + (++j * j++);
        System.out.println(j);//5

关系运算符

  • 关系运算符又可以叫比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true或者false

 代码示例 

public class Demo05Operator {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a == b); // false
        System.out.println(a != b); // true
        System.out.println(a > b); // false
        System.out.println(a >= b); // false 
        System.out.println(a < b); // true
        System.out.println(a <= b); // true 
        // 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量
        boolean flag = a > b;
        System.out.println(flag);// false
    }
}

注意事项:

  • 其中>,<,>=,<=不支持boolean,String类型。==和!=支持boolean和String。
  • 千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。

逻辑运算符

  • 逻辑运算符,是用来连接多个布尔类型结果的运算符(!除外),运算结果一定是boolean值true或者false。
  • 逻辑运算符作用: 用于整合多个比较表达式的条件

 代码示例、

public class Demo6Operator {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = 5;

        //& “与”,并且的关系,只要表达式中有一个值为false,结果即为false
        System.out.println((a > b) & (a > c));  //false
        System.out.println((a > b) & (a < c));  //false
        System.out.println((a < b) & (a > c)); //false
        System.out.println((a < b) & (a < c)); //true

        // | “或”,或者的关系,只要表达式中有一个值为true,结果即为true
        System.out.println((a > b) | (a > c)); //false
        System.out.println((a > b) | (a < c)); //true
        System.out.println((a < b) | (a > c)); //true
        System.out.println((a < b) | (a < c)); //true


        // ^ 异或;相同为false,不同为true
        System.out.println((a > b) ^ (a > c)); //false
        System.out.println((a > b) ^ (a < c));//true
        System.out.println((a < b) ^ (a > c));//true
        System.out.println((a < b) ^ (a < c));  //false


        // ! 非;非false则true,非true则false
        System.out.println(!false);   //true
        System.out.println(!true); //false
    }
}

短路逻辑运算符

  • 在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值 都计算出来,短路与操作就有这样的效果,可以提高效率。
  • 同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。 

&& 和& 区别:

  • &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。

|| 和 | 区别:

  • ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。

代码示例

/*
逻辑运算符的短路效果
    1.短路的逻辑运算符
        (1)短路逻辑与&&: 左侧为false,右边不计算
        (2)短路逻辑或||: 左侧为true,右侧不计算
    2.特点:
        (1)短路逻辑与&&: 和&结果是相同的,但是&&可以提高效率
        (2)短路逻辑与||: 和|结果是相同的,但是||可以提高效率
 */
public class Demo08Operator {
    public static void main(String[] args) {

        int a = 2;
        /*
            整个表达式(3>5)&&(++a>2)从左向右计算
            先计算表达式3>5结果为false
            因为两个表达式使用&&连接,左侧为false,已经决定了最终的结果为false,
            不管右侧表达式(++a>2)的结果是true还是false,都无法改变&&的最终结果,
            所以右侧表达式(++a>2)不进行计算
         */
        System.out.println((3 > 5) && (++a > 2));//false
        System.out.println(a);//2: 说明++a没有计算,&&右侧的表达式没有执行

        int b = 2;
        /*
            整个表达式(3>5)&(++b>2)从左向右计算
            先计算表达式3>5结果为false
            因为两个表达式使用&连接,左侧为false,虽然已经决定了最终的结果为false,
            但是右侧表达式(++b>2)仍然要进行计算,所以b的值最终是3
         */
        System.out.println((3 > 5) & (++b > 2));//false
        System.out.println(b);//3: 说明++b进行计算,&右侧的表达式执行了

        System.out.println("-------------------");
        int c = 2;
        /*
            整个表达式(3<5)||(++c>2)从左向右计算
            先计算表达式3<5结果为true
            因为两个表达式使用||连接,左侧为true,已经决定了最终的结果为true,
            不管右侧表达式(++c>2)的结果是true还是false,都无法改变||的最终结果,
            所以右侧表达式(++c>2)不进行计算
         */
        System.out.println((3 < 5) || (++c > 2));//true
        System.out.println(c);//2: 说明++c没有计算,||右侧的表达式没有执行

        int d = 2;
        /*
            整个表达式(3<5)|(++d>2)从左向右计算
            先计算表达式3<5结果为true
            因为两个表达式使用|连接,左侧为true,虽然已经决定了最终的结果为true,
            但是右侧表达式(++d>2)仍然要进行计算,所以d的值最终是3
         */
        System.out.println((3 < 5) | (++d > 2));//true
        System.out.println(d);//3: 说明++d进行计算,|右侧的表达式执行了

    }
}

三元运算符

语法格式:

  • 数据类型 变量名称 = 布尔表达式1 ? 表达式2 : 表达式3;

执行流程:

  1. 计算布尔表达式1的结果,看是true还是false
  2. 如果布尔表达式1的结果为true,就把表达式2的结果赋值给左侧的变量
  3. 如果布尔表达式1的结果为false,就把表达式3的结果赋值给左侧的变量

执行流程图解:

代码示例

/*
一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
分析:
        ① 用三元运算符获取前两个身高数的最大值,并用临时变量保存起来。
        ② 用三元运算符,让临时最大值,和第三个身高,进行比较,并记录结果。
        ③ 输出结果
 */
public class Demo08Operator {
    public static void main(String[] args) {
        //1:定义三个变量用于保存和尚的身高,单位为cm,这里仅仅体现数值即可。
        int h1 = 150;
        int h2 = 210;
        int h3 = 165;
        //2:用三元运算符获取前两个和尚的较高身高值,并用临时身高变量保存起来。
        int temp = h1 > h2 ? h1 : h2;
        //3:用三元运算符获取临时身高值和第三个和尚身高较高值,并用最大身高变量保存。
        int max = temp > h3 ? temp : h3;
        //4:输出结果
        System.out.println("这三个和尚中身高最高的是:" + max + "cm");
    }
}

位运算(了解)

效率很高,但是可读性不好。因为它是基于二进制补码直接运算的。关于&,|,^,看左右两边的操作数是boolean值,还是整数,来决定是逻辑运算符还是位运算符。常见的有以下几种位运算符

左移:<<

  • 运算规则:<<几位,就乘以2的几次方
  • 二进制补码左移n位,右边补0

右移:>>

  • 运算规则:>>几位,就除以2的几次方
  • 二进制补码右移n位,左边补0还是1,看最高位

无符号右移:>>>

  • 运算规则:二进制补码右移n位,左边补0,对于负数来说,移完后,变为正数

运算符优先级

在表达式中,哪个运算符先执行后执行是要看优先级的,例如 “ *、/” 的优先级高于”+、-” 。运算符优先级如下图所示:

我们遵循一个原则:

  • 表达式不要写太复杂,可以分为多行
  • 实际开发中都是使用小括号来调整运算优先级

案例

// 目标:看看Java是否存在优先级,大家以后需要注意优先级问题
System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true
System.out.println( (10 > 3 || 10 > 3 ) && 10 < 3); // false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/119735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

AI芯片架构体系综述:芯片类型CPU\GPU\FPGA\ASIC以及指令集CSIS\RISC介绍

大模型的发展意味着算力变的越发重要&#xff0c;因为大国间科技竞争的关系&#xff0c;国内AI从业方在未来的一段时间存在着算力不确定性的问题&#xff0c;与之而来的是许多新型算力替代方案的产生。如何从架构关系上很好的理解计算芯片的种类&#xff0c;并且从计算类型、生…

Java附件和base64相互转换

1 文件转base64 声明&#xff1a;我用的是Hutool的Base64下的api package cn.hutool.core.codec; 首先找一张图片 很简单&#xff0c;直接使用Base64的encode方法就可以拿到文件的base64码&#xff1a; File file new File("D:\\Tools\\Images\\北极熊.jpg");String…

Feign服务调用

Feign服务调用 使用Feign&#xff0c;在服务消费者中&#xff0c;调用服务提供者的接口。 注册中心 此处使用 Nacos&#xff0c;详情见&#xff1a; https://www.cnblogs.com/expiator/p/17392549.html Feign依赖 <properties><java.version>1.8</java.vers…

OJ中常用平衡树,Treap树堆详解

文章目录 Treap定义Treap的可行性Treap的构建节点定义旋转左单旋右单旋旋转的代码实现 插入插入的代码实现 删除遍历查找Treap对权值的扩展Treap对size的扩展扩展size域后的节点定义和旋转&#xff0c;插入&#xff0c;删除操作查询第k小的元素求元素的排名 查询后继、前驱Trea…

虚幻引擎:RPC:远端调用

1.如何区当前是服务器还是在客服端 2.如何修改一个actor的所有权 修改所有权必须 在服务器上进行修改,不允许在客户端进行修改

大数据商城人流数据分析与可视化 - python 大数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

220v插座led指示灯维修

由于220v是交流电&#xff0c;有反向电压的情况&#xff0c;而led反向通电的时候电阻无穷大&#xff0c;所以分压也无穷大&#xff0c;220v一导通就击穿&#xff0c;即使加了很大的电阻也没用&#xff0c;串联电阻只能作用于二极管正向的时候。 目前有两种方案&#xff1a; 方…

远程运维用什么软件?可以保障更安全?

远程运维顾名思义就是通过远程的方式IT设备等运行、维护。远程运维适用场景包含因疫情居家办公&#xff0c;包含放假期间出现运维故障远程解决&#xff0c;包含项目太远需要远程操作等等。但远程运维过程存在一定风险&#xff0c;安全性无法保障&#xff0c;所以一定要选择靠谱…

【深度学习】pytorch——神经网络工具箱nn

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——神经网络工具箱nn 简介nn.Modulenn.Module实现全连接层nn.Module实现多层感知机 常用神经网络层图像相关层卷积层&#xff08;Conv&#xff…

MPLAB X IDE 仿真打断点提示已中断的断点?

这种中间带裂缝的是无效断点。 原因可能与XC编译器的优化有关&#xff0c;最后生成的汇编与C语言并不是一一对应的(官方给的解释是效率高)。所以这一行C语言转换的汇编代码可能并不在这个位置&#xff0c;也可能与其它汇编合并后根本就没有 我的解决方法是把优化等级调到最低&a…

MapReduce:大数据处理的范式

一、介绍 在当今的数字时代&#xff0c;生成和收集的数据量正以前所未有的速度增长。这种数据的爆炸式增长催生了大数据领域&#xff0c;传统的数据处理方法往往不足。MapReduce是一个编程模型和相关框架&#xff0c;已成为应对大数据处理挑战的强大解决方案。本文探讨了MapRed…

wpf添加Halcon的窗口控件报错:下列控件已成功添加到工具箱中,但未在活动设计器中启用

报错截图如下&#xff1a; 注意一下新建工程的时候选择wpf应用而不是wpf应用程序。 添加成功的控件&#xff1a;

python 之 正则表达式模块re

文章目录 findall例子&#xff1a;特点和注意事项&#xff1a; match示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; search示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; split示例&#xff1a;参数说明&#xff1a;注意…

尚硅谷大数据项目《在线教育之实时数仓》笔记006

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P041 P042 P043 P044 P045 P046 P047 P048 P049 P050 P051 P052 第9章 数仓开发之DWD层 P041 9.3 流量域用户跳出事务事实表 P042 DwdTrafficUserJum…

初步利用Ansible实现批量服务器自动化管理

1.Ansible介绍 Ansible是一款开源的自动化运维工具, 在2012年由Michael DeHaan创建, 现在由Red Hat维护。Ansible是基于Python开发的,采用YAML语言编写自动化脚本playbook, 可以在Linux、Unix等系统上运行, 通过SSH协议管理节点, 无需在被管理节点安装agent。Ansible以其简单、…

【计算机网络 - 自顶向下方法】第一章习题答案

P2 Question&#xff1a;   式 (1-1) 给出了经传输速率为 R 的 N 段链路发送长度为 L 的一个分组的端到端时延。 对于经过 N 段链路一个接一个地发送 P 个这样的分组&#xff0c;一般化地表示出这个公式。 Answer&#xff1a;    N ∗ L R \frac{N*L}{R} RN∗L​时&#x…

Amazon MSK 基于 S3 的数据导出、导入、备份、还原、迁移方案

Amazon MSK&#xff08;Amazon Managed Streaming for Apache Kafka&#xff09;是 Amazon 云平台提供的托管 Kafka 服务。在系统升级或迁移时&#xff0c;用户常常需要将一个 Amazon MSK 集群中的数据导出&#xff08;备份&#xff09;&#xff0c;然后在新集群或另一个集群中…

04、SpringBoot + 微信支付 --- 内网穿透ngrok(安装、使用)

Native 下单 1、内网穿透 ngrok 1-1&#xff1a;注册下载 下载 2-2&#xff1a;使用方式 直接在该目录cmd打开 第一次时候这个ngrok时&#xff0c;需要为计算机做授权 授权命令&#xff1a; ngrok config add-authtoken 2XmL8EfYQe6uVAjM9Iami0pWogd_5ztKmSxHs6UeAQn9RQB…

python 之异常处理结构

文章目录 常见的异常处理表现形式1. SyntaxError2. NameError3. TypeError4. IndexError5. KeyError6. ZeroDivisionError7. FileNotFoundErrortry……except …… 结构1. try 块2. except 块示例&#xff1a;多个except块try……except ……else 结构结构说明&#xff1a;示例…