java 运算符

2023-11-03

运算符介绍

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

算术运算符

算术运算符是对数值类型的变量进行运算的

常用的运算符有以下几个:      

注意:% 的本质:看一个公式 a % b = a - a / b * b(注意先乘除后加减);当a和b都是小数或其中一个是小数,会有一个强转,即公式变为 a % b = a - (int)(a / b) * b

public class Test {
    public static void main(String[] args){
        // 除号(/)的使用
        // 10 和 4 两个操作数都是int类型,所以运算结果最高也是int类型,所以只取2.5的整数部分,即2
        System.out.println(10 / 4); // 2
        // 10.0 为double,4位int,整个运算结果为double类型,所以结果为2.5
        System.out.println(10.0 / 4); // 2.5
        double d = 10.0 / 4;
        System.out.println(d); // 2.5

        // 10 和 4 两个操作数都是int类型,所以运算结果最高也是int类型,所以只取2.5的整数部分,即2
        // 赋值给double类型后,将2转换为double类型,变为2.0
        double d1 = 10 / 4;
        System.out.println(d1); // 2.0

        // 针对以下两个式子,有个疑问:
        // 为什么都是除得尽的情况,10.1 / 5 得到的是2.02这个刚好除得尽的结果,而8.1 / 3得到的却是一个近似值
        System.out.println(10.1 / 5); // 2.02
        double d2 = 8.1 / 3;
        System.out.println(d2); // 2.6999999999999997


        // 取余(%)
        // % 的本质:看一个公式 a % b = a - a / b * b(注意先乘除后加减)
        // 10 % 3 = 10 - 10 / 3 * 3 = 10 - 3 * 3 = 10 - 9 = 1 (注意!!在Java中 10 / 3 = 3,不是除不尽)
        System.out.println(10 % 3); // 1
        // -10 - (-10) / 3 * 3 = -10 - (-3) * 3 = -10 - (-9) = -10 + 9 = -1
        System.out.println(-10 % 3); // -1
        // 10 - 10 / (-3) * (-3) = 10 - (-3) * (-3) = 10 - 9 = 1
        System.out.println(10 % -3); // 1
        // -10 - (-10) / (-3) * (-3) = -10 - 3 * (-3) = -10 - (-9) = -1
        System.out.println(-10 % -3); // -1


        // 自增的两个经典面试题,自减和自增同理
        // 第一题
        int i = 1;
        // 以下运算是先赋值在自增
        // 计算机内部会使用一个临时变量存储结果:(1)temp = i;(i初始为1) (2)i = i + 1; (3)i = temp;
        // 相当于 j = i++; (1)temp = i;(i初始为1) (2)i = i + 1; (3)j = temp;
        i = i++;
        System.out.println(i); // 1

        // 第二题
        int i1 = 1;
        // 以下结果是先自增再赋值
        // (1)i1 = i1 + 1; (2)temp = i1; (3)i1 = temp;
        // 相当于 j = ++i1; => (1)i1 = i1 + 1; (2)temp = i1; (3)j = temp;
        i1 = ++i1;
        System.out.println(i1); // 2

    }
}

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

  • 关系运算符的结果都是boolean型,要么是true,要么是false
  • 关系表达式经常用在if结构的条件中或者循环结构的条件中
  • 关系运算符组成的表达式,成为关系表达式

逻辑运算符

  • 短路与 &&,短路或  ||,取反 !
  • 逻辑与 &,逻辑或 |,逻辑异或  ^
  • 短路与和逻辑与的区别:当第一个条件为假时,短路与不会对第二个条件进行判断,而逻辑与则是不管第一个条件是真是假,都会对第二个条件进行判断
  • 同理,短路或是当第一个条件为真时,不会对第二个条件进行判断,而逻辑或是不管第一个条件是真是假,都会对第二个条件进行判断
  • 异或:只有两个条件不一样时为真

如下表所示: 

赋值运算符

  • 基本赋值运算符:=
  • 复合赋值运算符:+=、-=、/=、*=、%=
  • 赋值运算符的特点:
    • 运算顺序从右往左,int num = a + b; 先计算a + b,再把结果赋值给num
    • 赋值运算符的左边只能是变量,右边可以是常量、变量、表达式
    • 复合赋值运算符等价于以下效果:a += 3 <=> a = a + 3
    • 复合赋值运算符会进行类型转换  
      public class Test {
          public static void main(String[] args){
              // 复合赋值运算符会进行类型转换
              byte b = 1;
              // 以下式子按道理来说等价于 b = b + 3;
              // b 是byte类型,3 是int类型,运算结果为int类型,再赋值给byte类型的变量b,理论上会报错
              // 但是底层会进行类型转换,所以不会报错,自增和自减同理,也会进行类型转换
              // 但如果直接写成:b = b + 3; 这样就会报错,因为这样子写不会进行类型转换,所以会报不能把int类型赋值给byte类型的错误
              b += 3; // 这样写等价于 b = (byte)(b + 3);
          }
      }

三元运算符

  • 基本语法:条件表达式 ? 表达式1 : 表达式2,条件表达式为true,返回表达式1的运算结果,否则返回表达式2的运算结果

运算符优先级

下表的优先级从上往下依次降低

位运算符

java中有7个位运算符:

  • & 按位与:两位全为1,结果为1,否则为0
  • | 按位或:两位有一位为1,结果为1,否则为0
  • ^ 按位异或:两位一个为0,一个为1,结果为1,否则为0
  • ~ 按位取反:0变为1, 1变为0
    public class Test {
        public static void main(String[] args){
            // 推导
            // 计算机中的所有运算都是以补码的形式进行计算,结果是以原码形式输出
            // 1、求 2 的补码,先要求出 2 的原码,再求 2 的反码,最后求 2 的补码
            // 2 是int类型,占四个字节,2 的原码 00000000 00000000 00000000 00000010
            // 由于 2 是正数,所以三码合一
            // 2 的补码为       00000000 00000000 00000000 00000010
            // 同理,3 的补码为  00000000 00000000 00000000 00000011
            // 按位与的结果为    00000000 00000000 00000000 00000010 (该结果为补码)
            // 因为上述补码运算结果为正数(符号位为0),三码合一
            // 所以上述补码的的原码为 00000000 00000000 00000000 00000010
            // 转为十进制,推导出的输出结果为2
            System.out.println(2 & 3); // 2
    
            // 求 -2 的补码,先要求出 -2 的原码,再求 -2 的反码,最后求 -2 的补码
            // 负数的原码求补码可用一个技巧:从右边数第一个1及其右边保持不变,左边按位取反(符号位不取反)
            // -2 是int类型,占四个字节,-2 的原码 10000000 00000000 00000000 00000010
            // -2 的补码为         11111111 11111111 11111111 11111110
            // ~-2操作:按位取反    00000000 00000000 00000000 00000001  (该结果为补码)
            // 将上述结果为正数,三码合一,所以转变为原码为 00000000 00000000 00000000 00000001
            // 转为十进制,推导出的输出结果为1
            System.out.println(~-2); // 1
    
            // 2 是int类型,占四个字节,2 的原码 00000000 00000000 00000000 00000010
            // 三码合一,2 的补码为  00000000 00000000 00000000 00000010
            // ~2操作:按位取反      11111111 11111111 11111111 11111101  (该结果为补码)
            // 将上述结果为负数,所以转变为原码为 10000000 00000000 00000000 00000011
            // 转为十进制,推导出的输出结果为-3
            System.out.println(~2); // -3
    
            // 按位或、按位异或同理
            // 2 的原码   00000000 00000000 00000000 00000010
            // 3 的原码   00000000 00000000 00000000 00000011
            // 三码合一
            // 2 的补码   00000000 00000000 00000000 00000010
            // 3 的补码   00000000 00000000 00000000 00000011
            // 2 ^ 3结果  00000000 00000000 00000000 00000001  (运算结果为补码)
            // 补码为正数,所以原码也为 00000000 00000000 00000000 00000001
            // 对应的十进制为 1
            System.out.println(2 ^ 3); // 1
        }
    }
  • >> 算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
  • << 算术左移:符号位不变,低位补0
  • >>> 逻辑右移,也叫无符号右移:低位溢出,高位补0
  • 没有 <<< 符号
    public class Test {
        public static void main(String[] args){
            // 1 右移 2 位,本质是 1 / 2 / 2 = 0
            // 1 的补码:00000000 00000000 00000000 00000001
            // 右移两位,低位溢出,符号位不变,用符号位补溢出的高位
            // 所以结果为 00000000 00000000 00000000 000000 00(符号位补溢出的位置) 01(溢出,直接丢弃)
            // 上述补码结果还是正数,所以源码也为00000000 00000000 00000000 00000000
            // 结果为0
            System.out.println(1 >> 2); // 0
    
            // 1 左移 2 位,本质是 1 * 2 * 2 = 4
            // 1 的补码:00000000 00000000 00000000 00000001
            // 左移两位,不溢出的情况下符号位不变,低位补0
            // 所以结果为 00000000 00000000 00000000 00000001 00(低位补0)
            // 上述补码结果还是正数,所以源码也为00000000 00000000 00000000 00000001 00
            // 结果为4
            System.out.println(1 << 2); // 4
    
            // 低位溢出,高位补0
            // 2 的补码  00000000 00000000 00000000 00000010
            // 逻辑右移 3 位 000(高位补0) 00000000 00000000 00000000 00000 010(丢弃)
            System.out.println(2 >>> 3); // 0
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 运算符 的相关文章

随机推荐

  • 计算机网络校园网建设设计摘要,计算机网络专业校园网建设设计.doc

    计算机网络专业校园网建设设计 目录 摘要I 第1章 校园网概述1 第2章 校园网的需求分析与设计方案3 2 1需求分析3 2 2网络层次分析4 2 3总体设计方案5 2 4网络设备选型6 2 5校园网拓扑结构图8 2 6信息点的设置9 第3
  • PCB设计相邻焊盘间走线

    1 对于SOP小引脚间距SMT元器件的Layout 有时候我们会遇到该类元器件相邻Pin脚之间需要网络互联的情况 有时候大家直接在焊盘中间走线将pin脚短接 如下图所示 左边第7第8焊盘之间直接短接在一起了 在电气连接上没有问题 但是在SM
  • 完整单链表程序

    本文采用插入采用头插法 删除采用任意位置删除 什么是链表 链表就是结构体变量与结构体变量通过指针连接在一起 单链表主要是数据域和指针域构成 单链表的编程思路 动态内存申请 模块化设计 1 动态内存申请就是为了使得结构体指针变为结构体变量 2
  • 2016年物联网:你需要知道这6点

    本文转载至 http net zdnet com cn network security zone 2016 0127 3072246 shtml 物联网把汽车 可穿戴设备 及所有日用品连接到云端 这是目前科技领域的一个热点 物联网领域的芯
  • vue项目中实现汉字转拼音缩写

    前段时间接到了这样一个需求 注册页面中有多个输入框 要求第一个输入框输入汉字后 第二个输入框自动填充对应的拼音开头缩写 实现思路是这样的 第一步完成拼音转汉字缩写功能 第二步为第一个输入框添加失焦事件 失焦时计算当前对应拼音缩写 如第一个输
  • Docker容器启动前的初始化(备忘)

    摘录至 https github com yeasy docker practice blob master image dockerfile entrypoint md 场景二应用运行前的准备工作 之前在做mysql的docker swa
  • Keras使用分批迭代(fit_generate)的方式训练数据

    文章参考 https blog csdn net lujiandong1 article details 54869170 说明 我是在keras的官方demo上进行修改https github com fchollet keras blo
  • Android Launcher应用进程启动流程 基于Android-12

    最近研究了一下Launcher应用进程的创建流程 记录一下 以下只记录一些关键点 因为整体流程特别繁琐 1 ActivityManagerService 应用进程的启动 切换和调度 四大组件的启动和管理 gt systemReady 系统服
  • 百度翻译js渗透

    项目 python请求百度翻译API接口 流程 1 目标网站 www fanyi baidu com 2 抓包找到正确的动态请求 3 分析请求参数 找出会变化的参数sign token 4 JS渗透 找出参数js生产过程 5 模拟js生产参
  • 使用Recyclerview实现多布局效果

    Android应用开发中Recyclerview的使用频率非常高 多布局是使用Recyclerview经常实现效果之一 这里简单介绍一下多布局的基本开发流程 实现一个简单的多布局效果 实现如下效果图 一 创建数据类 创建数据类 用以模拟多布
  • 线性代数之矩阵与坐标系的转换

    空间中的点是可以用向量来描绘的 这些点的描绘是基于我们自建的欧式空间坐标系下 我们可以用一个行向量来表示一个空间的点 那我们的要进行空间坐标的转换的时候怎么办呢 一个行向量 B 我可以理解成IB B的三个值既为三个行向量 1 0 0 0 1
  • ffmpegMP4编码转换为h264

    ffmpeg i input mp4 vcodec h264 output mp4
  • 让phpstorm智能提示laravel代码

    简介 PhpStorm 默认情况下是没有对Laravel框架的代码提示功能的 下面给出Laravel 5 在PhpStorm 2019 1版本下的安装过程 1 开一个laravel项目 2 在根目录运行如下命令 进行安装 copycompo
  • 创建applicationContext.xml

    1 创建applicationContext xml并导入头文件
  • Qt三维图形添加纹理,并使图形旋转。立体图形添加纹理。

    一重山 两重山 山远天高烟水寒 相思枫叶丹 菊花开 菊花残 塞雁高飞人未还 一帘风月闲 pro中添加 QT core gui opengl win32 LIBS lOpengl32 lglu32 lglut mainwindow h ifn
  • 跟我一起写 Makefile(十)

    跟我一起写 Makefile 十 本文来自于CSDN 陈皓博主 网址http blog csdn net haoel article details 2895 详细内容请参考其经典文章 跟我一起写makefile 陈皓
  • 树莓派VLC获取实时视频流

    一 安装VLC之前 升级安装程序apt get sudo apt get update sudo apt get upgrade 二 在摄像头已激活的情况下 安装VLC 输入命令 sudo apt get install vlc VLC安装
  • 【全解析】屏幕尺寸,分辨率,像素,PPI之间到底什么关系?

    全解析 屏幕尺寸 分辨率 像素 PPI之间到底什么关系 2015 09 02 12 22 稿源 产品100 5条评论 撤稿纠错 今天我给大家来讲讲这几个咱们经常打交道的词到底啥意思 以及他们之间到底有什么关系 这篇文章是我花了一个下午从N多
  • vue+nodejs实现文件上传

    前端
  • java 运算符

    运算符介绍 运算符是一种特殊的符号 用以表示数据的运算 赋值和比较等 算术运算符 算术运算符是对数值类型的变量进行运算的 常用的运算符有以下几个 注意 的本质 看一个公式 a b a a b b 注意先乘除后加减 当a和b都是小数或其中一个