Java中的运算符

news2024/11/24 17:44:05
  • 算术运算符:+, -,*,/,%,++,--
  • 关系运算符:==,!=,<,>,<=,>=
  • 逻辑运算符:&&,||,!,&,|,^
  • 位运算符:&,|,~,^
  • 移位运算符:<<, >>, >>>
  • 赋值运算符:=,+=,-=,*=,/=,%=,&=,!=,^=,>>=,<<=,>>>=
  • 条件运算符:表达式1 ? 表达式2:表达式3
  • 其他运算符:[ ],.,(),(type),new,instanceof

1.算术运算符

1.1.二元算术运算符(基本五则运算符):+, -,*,/,%

注:

1).int/int结果还是int,/需要用double来计算;

2).0不能作为除数;

3).%表示取余,不仅可以对int求模,也能对double求模;

1.2.一元算术运算符:+,-,(自增/自减运算符):++,--

运算符用法功能描述
++op如果op是byte,short或char类型,则将op类型提升为int型
--op取op的负值
int a = 10;
int b = ++a; //先+1后赋值
System.out.println(b); //b = 11, a = 11
int c = a++; //先赋值后+1
System.out.println(c); //c = 10, a = 11

注:

1).如果不取自增运算的表达式的返回值,则前置自增和后置自增没有区别;

2).如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值。

3).Java中没有幂运算符,必须采用Java.lang.Math类的pow()方法:

public static double pow(double a, double b); //返回值是a的b次方

Java.lang.Math类提供了大量数学和工程函数。

例如:Π和e均由常数表示,且为双精度类型,非常准确。

Math类包含数学函数:平方根,自然对数,乘幂,三角函数等;

也包含一些基本函数:如可对浮点数进行四舍五入运算,计算同样类型两个数字的最大和最小值,计算绝对值等。

2.关系运算符:==,!=,<,>,<=,>=

int a = 10;
int b = 20;
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 >= b);

注:

1).关系运算符的表达式返回值都是boolean类型。

2).Java中,任何类型的数据(包括基本数据类型和复合类型)都可以通过==或!=来比较是否相等(这与C和C++不同)。

3.逻辑运算符:&&,||,!,&,|,^

注:逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是boolean。

3.1.逻辑与&&

规则:两个操作数都为true,结果为true,否则结果为false.

int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);

3.2.逻辑或||

规则:两个操作数都为false,结果为false,否则结果为true.

int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < c);

3.3.逻辑非!

规则:操作数为true,结果为false;操作数为false,结果为true(这是个单目运算符,只有一个操作数)

int a = 10;
int b = 20;
System.out.println(!a < b);

短路求值

&&和||遵守短路求值规则。

System.out.println(10 > 20 && 10 / 0 == 0); //打印false
System.out.println(10 < 20 || 10 / 0 == 0); //打印true
//计算10/0会导致程序抛出异常,但是上面的代码却能正常运行,说明10/0并没有正常被求值

结论:

1).对于&&,如果左侧表达式值为false,则表达式整体的值一定是false,无需计算右侧表达式;

2).对于||,如果左侧表达式值为true,则表达式整体的值一定是true,无需计算右侧表达式。

3.4&3.5.   不短路与或运算 & 和 |(不推荐使用)

& 和 | 如果操作数为boolean的时候,也表示逻辑运算,但是和&& 以及 || 相比,它们不支持短路求值。

System.out.println(10 > 20 & 10 / 0 == 0); //程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); //程序抛出异常

3.6.  ^

op1^op2:op1和op2值不同,即一个取true,另一个取false时,返回true。

4.位运算符:&,|,~,^

Java中对数据的操作的最小单位不是字节,而是二进制位。

位操作表示按二进制位运算,计算机中都是使用二进制来表示数据的(01构成的序列),按位运算就是按照二进制位的每一位依次进行计算。

4.1.按位与&:如果两个二进制位都是1,则结果为1,否则结果为0

int a = 10;
int b = 20;
System.out.println(a & b);

进行按位运算,首先要把10和20转成二进制,分别为1010和10100.

10       ->       01010

20       ->       10100

结果    ->       00000   转换为十进制为0

4.2.按位或|:如果两个二进制位都是0,则结果为0,否则结果为1

int a = 10;
int b = 20;
System.out.println(a | b);

运算方式和按位与类似。

4.3.按位取反~:如果该位为0则转为1,如果该位为1则转为0

public class Test {
    public static void main(String[] args) {
        int a = 0xf;
        System.out.printf("%x\n", ~a);
        System.out.println(~a);
    }
}

注:

1).0x 前缀的数字为十六进制数字,十六进制可以看成是二进制的简化表示方式。一个十六进制数字对应 4 个二进制位。

2).0xf 表示 10 进制的 15, 也就是二进制的 1111。

3).printf 能够格式化输出内容, %x 表示按照十六进制输出。

4).\n 表示换行符

4.4.按位异或 ^: 如果两个数字的二进制位相同, 则结果为0, 相异则结果为1

int a = 0x1;
int b = 0x2;
System.out.printf("%x\n", a ^ b);

经典问题:一个数组中只有一个数出现一次,其他数都出现两次,请找到这个数。

注:

当 &,|和^ 的操作数为整数(byte,short,int,long)时,表示按位运算,当操作数为boolean时,表示逻辑运算。

5.移位运算符:<<, >>, >>>

算术左移操作符:<<

算术右移操作符:>>

逻辑右移操作符:>>>

Java使用补码来表示二进制数。因此移位运算都是针对整型数的二进制补码进行。在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:

1).对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。

2).对负数来说,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-1的补码为11111111(-1绝对值的补码为00000001,按位取反再加1为11111110+1=11111111)。用补码来表示数,0的补码是唯一的,为00000000。

运算符用法操作描述
<<op1<<op2将op1向左移动op2个位
>>op1>>op2将op1向右移动op2个位
>>>op1>>>op2将op1向右移动op2个位(无符号)

5.1.左移 <<: 最左侧位不要了, 最右侧补 0.

int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20

十六进制数转换为二进制数:将十六进制数的每一位转换为4位二进制数,组合。

0x10 -> 0001 0000

左移  -> 0010 0000

 结果  ->      2       0

5.2.右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)

int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8
int b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000

0x10 -> 0001 0000                                   

右移  -> 0000 1000                 

结果  ->       0       8                

0xffff0000 -> 1111 1111 1111 1111 0000 0000 0000 0000    

右移         -> 1111 1111 1111 1111 1000 0000 0000 0000

结果         ->       f       f       f       f       8        0       0       0

5.3.无符号右移 >>>: 最右侧位不要了, 最左侧补 0

int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff

0xffffffff         -> 1111 1111 1111 1111 1111 1111 1111 1111

无符号右移   -> 0111 1111 1111 1111 1111 1111 1111 1111

结果              ->       7      f       f       f        f       f       f        f

注:
1). 左移 1 位,相当于原数字 * 2,左移 N 位, 相当于原数字 * 2 的N次方。

2). 右移 1 位,相当于原数字 / 2,右移 N 位,相当于原数字 / 2 的N次方。

3). 由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替。

4). 移动负数位或者移位位数过大都没有意义。

6.赋值运算符:赋值运算符扩展赋值运算符

6.1.赋值运算符:"="

6.2.扩展赋值运算符:在"="前加上其他运算符

+=:a += 3 等价于 a = a + 3

-=,*=,/=,%=,&=,!=,^=,>>=,<<=,>>>=

7.条件运算符:表达式1 ? 表达式2:表达式3

当表达式1的值为true时,整个表达式的值为表达式2的值;当表达式1的值为false时,整个表达式的值为表达式3的值。

也是Java中唯一的一个三目运算符,是条件判断语句的简化写法。

// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;

8.其他运算符:[ ],.,(),(type),new,instanceof

运算符格式操作描述
[ ]type[ ]声明类型为type的数组
[ ]type[op1]创建op1个元素的数组
[ ]op1[op2]访问op1数组的索引为op2的元素
.op1.op2引用op1对象的成员op2
( )op1(params)方法调用
(type)(type)op1将op1强制类型转换为type类型
newnew op1创建对象或数组。op1可以是构造方法的调用,也可以是数组的类型和长度
instanceofop1 instanceof op2如果op1是op2的实例,则返回true

9.运算符的优先级

运算符之间是有优先级的。具体的规则我们不必记忆。在可能存在歧义的代码中加上括号即可。

优先级顺序运算符类别运算符
1后缀运算符[ ],.,(params)expr++,expr--
2一元运算符++expr,--expr,+expr,-expr,~,!
3创建或强制类型转换new(type)expr
4乘,除,求余*,/,%
5加,减+,-
6移位<<,>>,>>>
7关系运算<,>,<=,>=,instanceof
8相等性判定==,!=
9按位与&
10按位异或^
11按位或|
12逻辑与&&
13逻辑或||
14条件运算?:
15赋值=,+=,-=,*=,/=,%=,&=,!=,^=,>>=,<<=,>>>=


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的温度控制系统

提示&#xff1a;记录毕设 文章目录前言一、任务书1.1设计(研究)目标:1.2设计(研究)内容:二、代码思路三、硬件四、联系我们五、设计六、框图代码等资料喜欢请点赞哦&#xff01;前言 基于STM32的温度控制系统&#xff0c;主控使用STM32F103ZET6&#xff0c;在正点原子的精英板…

ubuntu18.0 调节显卡GPU涡轮风扇转速

前言&#xff1a; 在炼丹的时候发现涡轮显卡的温度已经很高了85摄氏度&#xff0c;但是涡轮的风扇转速还不到65%&#xff0c;此时显卡计算频率明显已经下降了&#xff0c;所以需要手动调节风扇的转速&#xff0c;让噪音和计算速度处于均衡状态。 一、准备工作 》》安装显卡驱…

html:自定义网页右键菜单

<div id"menu"><divclass"menu-item"data-id"1">功能1</div><divclass"menu-item"data-id"2">功能2</div><divclass"menu-item"data-id"3">功能3</div><…

股票购买接口委托下单c++代码

炒股并非是运气可以驱使的&#xff0c;买股票不是赌博&#xff0c;是一种有风险的经济投资。在股市投资生涯中&#xff0c;掌握一门实战买卖技巧是我们必备的武器&#xff0c;这也是我们能长久在股市投资中得以生存的技法。 其实做股票投资是非常讲究买入和卖出的时机的。一只…

图像风格迁移-DSTN

样式传输的目的是从参考图像中再现具有样式的内容图像。现有的通用风格转换方法成功地以艺术或照片逼真的方式将任意风格传递给原始图像。然而&#xff0c;现有作品所定义的“任意风格”的范围由于其结构限制而在特定领域内受到限制。具体而言&#xff0c;根据预定义的目标域来…

用vscode配置C++3种编译器及多文件编译

末尾附上最终的模板 Vscode开发环境配置 C有很多种编译器&#xff0c;最重要的有三种 GNU的GCC(推荐)微软的MSVCClang/LLVM C的最新标准是C23,各个编译器对C各个标准的支持情况是不同的&#xff1a; C compiler support - cppreference.com 注意主要看C20的支持情况 用Vsco…

校园进销存网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 功能模块包括&#xff1a;员工模块、手机类型模块、供应商模块、采购模块、客户模块、销售模块、统计模块、库存模块 (1…

2022年的最后一个Win11 Dev预览版本

今日凌晨&#xff0c;微软向广大Win11 Dev用户推送了今年的最后一个版本更新&#xff0c;版本号为25267。根据官方的变化&#xff0c;引入了改变任务栏中可用搜索框样式的设置。此外&#xff0c;此版本还对任务栏、文件资源管理器、设置等进行了各种增强。 该公司还表示&#x…

nacos使用教程及原理简介

一、什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos的关键特性包括&#xff1a; 服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元…

java排序算法

目录 一 冒泡排序 二 选择排序 三 插入排序 四 希尔排序 五 快速排序 5.1 单边循环快速排序 5.2 双边循环快速排序 六 二分查找 七 总结 一 冒泡排序 依次比较数组中相邻的两个元素&#xff0c;若 arr[i] > arr[i1]&#xff0c;则交换两个元素&#xff0c;两两都比…

RabbitMQ原理剖析

常见的消息队列很多&#xff0c;主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ&#xff0c;本篇文章只讲 RabbitMQ&#xff0c;先讲原理&#xff0c;后搞实战。 直接上思维导图&#xff1a; 1. 消息队列 1.1 消息队列模式 消息队列目前主要 2 种模式&#xff0c;分别为“…

【AI with ML】第 6 章 :使用嵌入使情绪可编程

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Web安全研究(二)

TChecker: Precise Static Inter-Procedural Analysis for Detecting Taint-Style Vulnerabilities in PHP Applications 香港中文大学&#xff0c;CCS2022 Abstract 由于php语言的高度复杂性&#xff0c;现有的污点分析解决方案由于其不全面的程序间分析和各种实现问题&#…

DIV简单个人静态HTML网页设计作品 WEB静态个人介绍网页模板代码 DW个人网站制作成品 期末网页制作与实现

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

jmeter压测线程5000后内存溢出问题解决

一.报错内容&#xff1a; ava.lang.OutOfMemoryError: Java heap space&#xff1a;意思就是堆内存溢出&#xff0c;不够用了 版本&#xff1a;jmeter5 内存溢出&#xff1a;应用的内存已经不能满足正常使用了&#xff0c;堆栈已经达到系统设置的最大值&#xff0c;进而导致崩…

【图像融合】高斯金字塔+拉普拉斯金字塔彩色水下图像融合【含Matlab源码 1629期】

⛄一、区域分割图像融合简介 图像的分解 对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解。 1 高斯金字塔分解 记源图像为G0,G0即为高斯金字塔最底层,将其进行高斯低通滤波,之后对其进行隔行隔列的下…

mysqldump实战-问题1

使用mysqldump导出数据时&#xff0c;遇到了一个权限问题(之前没报过这个提示) mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation when trying to dump tablespaces 查看当前用户的权限&#xff1a; 解决方法&…

ARM 指令流水线

CPU要执行某一个指令&#xff0c;第一步&#xff0c;PC给内存发送地址&#xff0c;IR接收内存返回的指令&#xff1b;第二步&#xff0c;指令译码器解析IR中的指令&#xff1b;第三步&#xff0c;寄存器执行译码结果对应的运算单元。 实际上&#xff0c;译码器在译码的时候&am…

flutter 基于百度地图的地图选址,包括移动选址,地区搜索 ,仿微信地图选址

flutter 最近有在地图上选择地址的需求&#xff0c;要求如下 1.移动地图获取根据地图中心点获取周边的poi信息 2.搜索&#xff0c;根据搜索内容提示相关地点信息&#xff0c;点击移动到相关位置&#xff0c;显示出该位置周边的poi信息 废话少说&#xff0c;先上视频 flutter…

菜鸟Linux(2):进程优先级与进程状态

"才一年,看着世界变迁,有种沧海桑田" 一、进程调度 与 进程优先级 (1)何为优先级 双击.exe(可执行程序)文件 会发生什么&#xff1f; 但是,当我们使用电脑的时候,不仅仅只会 启动一个程序&#xff01; 系统中一定会有多个 进程同时存在&#xff01; 然而,需求是无…