计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。

我们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,instanceof 运算符。

1. 算数运算符

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。

操作符 名称 描述
+ 加法 相加运算符两侧的值
减法 左操作数减去右操作数
* 乘法 相乘操作符两侧的值
/ 除法 左操作数除以右操作数
% 取余 左操作数除以右操作数的余数
++ 自增 操作数的值增加1
自减 操作数的值减少1

以下代码:

public static void main(String[] args) {
int a = 5;
int b = 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++));
System.out.println("“--” 运算:"+(a--));
}

输出结果:
“+” 运算:15
“-” 运算:-5
“*” 运算:50
“/” 运算:0
“%” 运算:5
“++” 运算:5
“–” 运算:6

另外,进行除法运算时,若两个操作数是整型的,结果也会是整型的,舍弃掉小数部分;如果有一个数是浮点数,结果将自动转型为浮点型。进行取余运算时,若两个操作数是整型的,结果也会是整型的,如果有一个数是浮点数,结果将自动转型为浮点型

**其中,自加和自减运算符针对一个数值本身的运算;且前缀自增自减(++a,–a)是先进行自增或者自减运算,再进行表达式运算。后缀自增自减(a++,a–)是先进行表达式运算,再进行自增或者自减运算。我们给出例子:

 public static void main(String[] args) {
int a = 5;
int b1 = 10;
int b2 = 10;
int c1 = 10;
int c2 = 10;
System.out.println("前缀自增b1参与表达式计算后值为:"+(a*++b1));
System.out.println("后缀自增b2参与表达式计算后值为:"+(a*b2++));
System.out.println("前缀自减b1参与表达式计算后值为:"+(a*--c1));
System.out.println("后缀自减b2参与表达式计算后值为:"+(a*c2--));
}

2. 比较运算符

比较运算符的结果一定是boolean类型,也叫关系运算符

操作符 名称 描述
> 大于 相加运算符两侧的值
< 小于 左操作数减去右操作数
== 等于 相乘操作符两侧的值
>= 大于等于 左操作数除以右操作数
<= 小于等于 左操作数除以右操作数的余数
!= 不等于 操作数的值增加1

如,

 public static void main(String[] args) {
int a = 5;
int b = 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 != b );
}

输出结果:
false
true
false
false
true
true
注意,比较运算符“==”用来比较基本数据类型是比较的是值是否相等,比较引用数据类型是比较的是引用是否相等,引用数据类型用equals()来比较字面量是否相等。

3. 逻辑运算符

操作符 名称 描述
&& 短路与 当且仅当两个操作数都为真,条件才为真。
& 逻辑与 当且仅当两个操作数都为真,条件才为真。
| | 短路或 如果任何两个操作数任何一个为真,条件为真。
| 逻辑或 如果任何两个操作数任何一个为真,条件为真。
! 逻辑非 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false

逻辑运算符中,“与”运算符和“或”运算符都有两个,“&&”我们称之为短路与。“||”我们称之为短路或,短语与“&&”从左到右一次判断,遇到false则停止判断,得出结果未false;逻辑与“&”从左到右一次判断,直至结束。短语或“||”从左到右一次判断,遇到true则停止判断,得出结果未true;逻辑或“|”从左到右一次判断,直至结束。我们给出例子:

 public static void main(String[] args) {
int a = 5;
int b = 10;
//短路与,前一个表达式的值为false,不在判断下一个表达式,故a++不执行
System.out.print((a>b)&&(a++ == 1));
System.out.println(" a的值:"+ a);
//逻辑与,前一个表达式的值为false,仍依次判断下一个表达式
System.out.print((a>b)& (a++ == 1));
System.out.println(" a的值:"+ a );
//短路或,前一个表达式的值为true,不在判断下一个表达式,故a++不执行
System.out.print((a<b)|| (b++ == 1));
System.out.println(" b的值:"+ b );
//逻辑或,前一个表达式的值为true,仍依次判断下一个表达式
System.out.print((a<b)| (b++ == 1));
System.out.println(" b的值:"+ b );
//非运算符
System.out.print(!(a<b));
}

4. 位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。

操作符 名称 描述
& 按位& 如果相对应位都是1,则结果为1,否则为0
| 按位或 如果相对应位都是0,则结果为0,否则为1。
^ 异或 如果相对应位值相同,则结果为0,否则为1
~ 按位取反 翻转操作数的每一位,即0变成1,1变成0。结果为: -(X+1)
<<   按位左移 |通常格式为:value << num,value按位左移num位
>> 有符号按位右移 通常格式为:value >> num,value按位右移num位。
>>> 无符号按位右移 通常格式为:value >> num,value按右移num位,移动得到的空位以零填充。

我们给出例子:

public static void main(String[] args) {
int a= 10;
int b = 20;
//a转化成二进制表示为:1010;b转化为二进制表示为:10100
//按位运算时,我们把a表示为:01010
System.out.println(a&b);
//按位与运算,有零则为零,都为1则表示为1,与的结果为:00000,即十进制的0
System.out.println(a|b);
//按位或运算,有1则为1,都为0则表示为0,或的结果为:11110,即十进制的30
System.out.println(a^b);
//按位或运算,对应位置相同则为0,否则为1,取反的结果为:11110,即十进制30
}

运行结果:
0
30
30

下面,我们来说一下按位取反,计算机内部都是以补码的形式在做数学运的,而我们所用的编码规则,例如原码、反码则是我们自定义的,用来方便和计算机中的补码来形成转化。故而,我们在进行按位取反是要把原码或者反码转化成补码的形式。正数的反码和补码与原码相等; 负数的反码是符号位不变,其余按位取反,补码为反码+1。负数的最高符号位为1。
如,

  public static void main(String[] args) {
int a= 10;
int b= -10;
System.out.println(~a);
System.out.println(~b);
}

运行结果为:-11,9。 分析如下: a为正数,其补码形式与原码相同,表示为:00001010,按位取反后为11110101,注意,此时为补码形式,转化为反码表示为,11110100,再转化为原码表示为:10001011,即十进制的-11.同样的,b为负数,其补码表示为:11110110,按位取反后为00001001,此时依然为补码形式,转化为原码即其本身00001001,即十进制的9。故,按位取反后的结果可表示为-(X+1)

接下来,我们给出例子来看一下位移运算符

public static void main(String[] args) {
int a= 10;
int b = -10;
//int为4个字节,也就是32位,为了简化a表示为:00001010,
// b为负数我们表示为:1000 0000 0000 0000 0000 0000 0000 1010
//b的补码形式为 1111 1111 1111 1111 1111 1111 1111 0110
System.out.println( a<<1 );
//按位左移,原则舍弃高位,低位补零表示为:00010100,即20
System.out.println(a>>1);
//按位右移,原则舍弃低位,高位补零表示为:00000101,即5
System.out.println(a>>1);
//按位右移,原则舍弃低位,高位补零表示为:10000101,即5
System.out.println(a>>>1);
//按位右移,原则舍弃低位,高位补零表示为:0000010,即5
System.out.println(b>>1);
//有符号按位右移,原则舍弃低位,符号位不变,其余高位补零原码表示为:
// 1000 0000 0000 0000 0000 0000 0000 0101,即-5
System.out.println(b>>>1);
//无符号按位右移,原则舍弃低位,高位补零(补码=原码)表示为:
// 0111 1111 1111 1111 1111 1111 1111 011,即十进制的,2147483643
}

输出结果:
20
5
5
5
-5
2147483643
总结一下,原则上,按位左移时,原则舍弃高位,低位补零;有符号按位右移,原则舍弃低位,符号位不变,其余高位补零;无符号按位右移,原则舍弃低位,高位补零。再次强调,做位移运算时,是按补码来进行运算的

5. 赋值运算符

操作符 名称 描述
= 赋值 右操作数的值赋给左侧操作数
+= 加和赋值 左操作数和右操作数相加赋值给左操作数 (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)
<< = 左移位赋值 左移位赋值运算符 (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)

基本的赋值运算符是“=”。他的优先级别低于其他的运算符,所以对该运算符往往最后读取,他不是“等于”,它的作用是将一个表达式的值赋给一个左值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量,以上其他是复合的赋值运算符又称为带有运算的赋值运算符,也叫赋值缩写。等同与先按运算符运算后再把运算结果付给左值(见表格)。具体运算方法上边儿已经罗列,此处不再赘述

6. 条件运算符

条件运算符也叫三目运算符

语法:

(条件) ? 结果一 : 结果二;

当条件成立,执行结果一,否则执行结果二。“?”前的值必须是true或flase
我们给出例子:

if(a<b)
min=a;
else
min=b; 可以用下面的三目运算符来处理
min = a<b ? a : b;

7. instanceof 运算符

instanceof运算符可以确定对象是否属于一个特定的类.该运算符是二目运算符,左边的操作元是一个对象,右边是一个类,当左边的对象是右边的类或子类创建的对象时,该运算符运算的结果是true,否则是false。,使用格式:( Object reference variable ) instanceof (class/interface type)

我们给出例子:

public static void main(String[] args) {
String a = "name";
System.out.println(a instanceof String);
System.out.println(a instanceof Object);
}

输出结果:true,true

8. 运算符优先级

在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的运算顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。相同优先级中,按结合顺序计算。

通常优先级由高到底的顺序依次是:
1. 括号级别最高,逗号级别最低;
2. 单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
3. 除了单目运算符、赋值运算符和条件运算符,其他的运算符都是从左到右结合的。

8. Java的运算符的更多相关文章

  1. java移位运算符具体解释

    java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的全部位都左移 ...

  2. JAVA的运算符和条件结构

    一.JAVA的运算符. 1.赋值运算符 赋值就是把一个变量的值赋给另一个变量. 语法: 变量名=表达式     例如  n = m + 5 2.算术运算符      算术运算符是数学中常用的加.减.乘 ...

  3. java位移运算符3 转

    https://www.cnblogs.com/winsker/p/6728672.html 移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 理解java移位运算符 运算 ...

  4. java位移运算符 转

    https://blog.csdn.net/qq_36134429/article/details/78286416#commentsedit java移位运算符不外乎就这三种:<<(左移 ...

  5. Java 位运算符和 int 类型的实现

    Java 位运算符和 int 类型的实现 其他运算符 # 算术运算符 +.-.*./.++i.i++.--i.i-- # 关系运算符 ==.!=.>.<.>=.<= # 逻辑运 ...

  6. 【java】运算符

    Java的运算符,分为四类: 算数运算符.关系运算符.逻辑运算符.位运算符. 算数运算符(9):+  -  *  /  %  ++  -- 关系运算符(6):==  !=  >  >=   ...

  7. java 增量运算符

    //java 增量运算符 public class Test16{ public static void main(String args[]) { int x1=10; x1+=3; //x1=x1 ...

  8. java三元运算符详解

    最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故 ...

  9. 利用Java位运算符,完成Unsigned转换(无符号)

    方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...

  10. java移位运算符详解

    http://soft.chinabyte.com/database/195/11553695.shtml java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和 ...

随机推荐

  1. spark ml pipeline构建机器学习任务

    一.关于spark ml pipeline与机器学习一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的流 ...

  2. python的url正则表达式

    网上有很多的正则表达式版本,大部分都不好使,下面这个比较好用: http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F] ...

  3. Spring cloud微服务安全实战-5-1单点登录基本架

    基于微服务架构,前后端分离实现SSO 前后端分离到底是个什么样的架构. 中间不是用Nginx而是用Node JS. node.js在服务端的页面渲染,这样搜索引擎爬虫 来爬的时候 爬的就是html页面 ...

  4. 报错:MetaException(message:Version information not found in metastore. )

    报错背景: CDH安装完成hive后启动失败. 报错现象: [main]: Metastore Thrift Server threw an exception... MetaException(me ...

  5. bootstrap 自带字体颜色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. HTML用table布局排版 padding清零

    之前博文:HTML布局排版2如何设置div总是相对于页面居中 中是用div进行排版的,div是切了三条,顶部的图片,下部的图片,中间的平铺条,中间的div不设高度,根据内容,该区域的大小不固定,便于后 ...

  7. 海思HI2115芯片-NB-IOT模块向外发短信测试

    1. 说是有短信这个功能,测试下怎么使用?先使能BIP功能 AT+NCONFIG=ENABLE_BIP,TRUE 给SIM卡上电 AT+NUICC= 查询下短信中心服务号码 AT+CSCA? 发送短信 ...

  8. etcd学习之安装与命令

    ETCD学习 下载etcd #下载 wget https://github.com/etcd-io/etcd/releases/download/v3.3.18/etcd-v3.3.18-linux- ...

  9. top命令常用

    top 使用时的命令: Ctrl+L擦除并且重写屏幕. h或者?显示帮助画面,给出一些简短的命令总结说明. k 终止一个进程.系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号. ...

  10. memmove和memcpy函数的区别及实现

    一.memmove()和memcpy()函数和strcpy()函数的区别: (1)使用的类型不同,strcpy()函数只对字符串进行操作:memmove()和memcpy()函数对所有类型都适用,为内 ...