计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,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. 除了单目运算符、赋值运算符和条件运算符,其他的运算符都是从左到右结合的。

最新文章

  1. Linux vi/vim(转载)
  2. 【CityHunter】服务器端设计思路
  3. TC250专场
  4. Java技能树
  5. (转)内联(inline)函数与虚函数(virtual)的讨论
  6. postman 添加环境变量 并 读取变量 作为参数 传入,跑整个场景
  7. BZOJ2253: [2010 Beijing wc]纸箱堆叠
  8. 异常:HRESULT: 0x80070057 (E_INVALIDARG) 的处理
  9. Jmail的邮件发送
  10. Android 进程和文件的UID/GID
  11. iOS开发之property属性介绍
  12. EF MySQL 提示 Specified key was too long; max key length is 767 bytes错误
  13. PowerMock mock私有方法
  14. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述
  15. Introduction to Probability (三) Independence
  16. Python面试题之python是一种什么语言及优缺点
  17. MySQL性能建议者mysqltuner.pl和pt-variable-advisor
  18. 如何查询注册表的值及 Powershell 应用
  19. CAS—认证原理
  20. 微软BI 之SSIS 系列 - 在 SSIS 中使用 Web Service 以及 XML 解析

热门文章

  1. linux内核中的电源管理接口
  2. iptables规则保存
  3. Delphi 操作SQL 插入一万条数据 三种方式速度测试
  4. linux安装上传下载工具lrszs
  5. String类型字符 常用的方法
  6. CentOS7下搭建Redis主从复制
  7. AnyCAD三维控件(转)
  8. deployment.yaml 带同步时区
  9. ELK之7版本Elastic Maps功能介绍
  10. TS - 问题解决力 - 上篇