运算符
Java中运算符可分为以下:算术运算符(+ - /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等
一.算术运算符
1.基本四则运算符 (+,-,*,/,%)
int a=10;
int b=5;
System.out.println(a+b); //15 加法
System.out.println(a-b); //5 减法
System.out.println(a*b); //50 乘法
System.out.println(a/b); //2 除法
System.out.println(a%b); //0 除法取余数
注意:
- 都是二元运算符,左右两边都要有操作数
- 整形变量 / 整形变量 结果还是整形变量,而且会向下取整
例如
int c=3;
int d=2;
System.out.println(c/d); //1 (1.5向下取整)
- 除法和取模时,右边操作数不能为0
例如
System.out.println(10/0);
System.out.println(10%0);
运行结果
Exception in thread “main” java.lang.ArithmeticException: / by zero
at test.main(test.java:16)
- 取模可以对double类型进行操作
例如
System.out.println(11.5%2.0); //1.5
5.两次操作数类型不一致时,存在浮点数就会变成浮点型
例如
long a=1;
double b=0.2;
int i=1;
float c=0.5f;
System.out.println(a+b); //1.2
System.out.println(i+b); //1.2
System.out.println(i-c); //0.5
2.增量运算符 (+=,-=,*=,/=,%=)
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数
int a=2;
a+=1; //相当于 a=a+1;
System.out.println(a); //3
a-=1; //a=a-1;
System.out.println(a); //2
a*=2; //a=a*2;
System.out.println(a); //4
a/=2; //a=a/2;
System.out.println(a); //2
a%=2; //a=a%2
System.out.println(a); //0
注意
- 只有变量才能使用该操作符,常量不行
3.自增/自减操作符 (++/–)
++表示变量的值加1,–表示变量的值减1
int a=1;
a++;
System.out.println(a); //2
System.out.println(a++); //2 ++放后面,表示先使用a的值再+1
System.out.println(++a); //4 ++放前面,表示先+1再使用a的值
System.out.println(a); //4
a–; //同理
System.out.println(a); //3
System.out.println(a–); //3
System.out.println(–a); //1
注意
- ++放后面,表示先使用a的值再+1;
- ++放前面,表示先+1再使用a的值 (–同理)
- 只有变量能使用,常量不行
二.关系运算符 (== != < > <= >=)
关系运算符主要有六个: == != < > <= >=
,其计算结果是 true 或者 false
int a=1;
int b=2;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
注意
- 需要多次判断时,不能连着写,如3<a<5
三.逻辑运算符 (&& || !)
1.&&
int a=1;
int b=2;
System.out.println(a== 1&&b== 2); //true
System.out.println(a== 1&&b== 3); //false
System.out.println(a== 2&&b== 2); //false
语法规则:表达式1&&表达式2,左右表达式必须是boonlean类型的结果
表达式1和表达式2全为真才为真,有一个假就为假
当表达式1为假时,就不会计算表达式2
例如 虽然下面表达式2是会报错,但因为表达式1已经为假,就不计算表达式2,因此没有报错
int a=1;
int b=2;
System.out.println(a== 2&&a/0== 0); //false
2.||
int a=1;
int b=2;
System.out.println(a== 1||b== 2); //true
System.out.println(a== 1||b== 3); //true
System.out.println(a== 2||b== 2); //true
System.out.println(a== 2||b== 3); //false
System.out.println(a== 1||a/0== 0); //true
System.out.println(a== 2||a/0== 0); //报错
语法规则:表达式1 || 表达式2,左右表达式必须是boonlean类型的结果
表达式1或2只要有一个为真就为真,全假才为假
同理当表达式1为真,就不会计算表达式2
3.!
int a=1;
System.out.println(!(a==1)); //false
System.out.println(!(a!=1)); //true
语法规则:! 表达式
假变真,真变假
四.位运算符 (& | ^ ~)
java中数据存储最小单位是字节,数据操作最小单位是比特,一个字节由八个二进制比特位组成
位运算符主要有四个:& | ^ ~
除了~
是一元运算符,其余都是二元运算符
1.按位与 &
如果两个二进制位都是1,则为1,否则就为0
int a=6;
int b=10;
System.out.println(a&b); //2
//为了简介只取后面八个二进制位展示计算 计算时要先转化为二进制位
a:0000 0110 //6
b:0000 1010 //10
c:0000 0010 // 结果 2
2.按位或 |
如果两个二进制位中只要有一个为1,则为1否则为0
int a=6;
int b=10;
System.out.println(a|b); //14
//为了简介只取后面八个二进制位展示计算 计算时要先转化为二进制位
a:0000 0110 //6
b:0000 1010 //10
c:0000 1110 // 结果 14
3.按位异或 ^
两个二进制位中只有一个为1就为1,否则为0
int a=6;
int b=10;
System.out.println(a^b); //12
//为了简介只取后面八个二进制位展示计算 计算时要先转化为二进制位
a:0000 0110 //6
b:0000 1010 //10
c:0000 1100 // 结果 12
4.按位取反 ~
如果该位为0就变为1,如果为1就变为0
int a=6;
int b=~a;
System.out.println(b); //-7
//为了简介只取后面八个二进制位展示计算
a:0000 0110 //6
b:1111 1001 //-7 符号位也发生了变化 此时是负数的补码,变成原码只要除符号位外取反加1即可
c:0000 0111 //原码
五.位移运算符 (<< >> >>>)
移位运算符有三个:<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的
注意没有<<<
1.左移运算符 <<
最右侧位补0,最左侧位不要
int a=2;
a<<=1; //1是向左移动一位
System.out.println(a); //4
//我们来简单的演示一下,前面的0就省略
// a:0010 左移前
// a:0100 左移一位后
注意:左移时由于符号位会丢失,因此左移可以改变符号
2.右移运算符 >>
正数最左侧位补0,负数补1,最右侧位不要
int a=2;
a>>=1; //1是向右移动一位
System.out.println(a); //1
//我们来简单的演示一下,前面的0就省略
// a:0010 右移前
// a:0001 右移一位后
3.无符号右移 >>>
最右侧位不要,最左侧位补0 (负数会变成正数)
int a=-4;
int b=a>>>1;
int c=4;
c>>>=1;
System.out.println(b); //2147483646
System.out.println©; //2
注意
- 左移n位相当*2的n次方
- 右移n位相当于/2的n次方
- 计算机移位的效率比高于直接计算
六.条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当表达式1为真,则整个表达式的值为表达式2的值
当表达式1为假,则整个表达式的值为表达式3的值
int a=1;
int b=a==1?2:3;
System.out.println(b);// 2
//求两个整数的最大值
int a=10;
int b=20;
int c=a>b?a:b;
注意:
- 表达式2和3的值要是同类型的,除法能发生类型隐式转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0; //报错
- 表达式不能单独存在,其产生的结果必须被使用
int a=10;
int b=20;
a>b?a:b; //报错
这里分享一道有意思的题目:
大家来想一下a等于什么?
boolean a=true == true?false?true:false:true;
这里我们来分析一下
表达式1: true==true
;
表达式2:false?true:false
;
表达式3:true:true
;
这样是不是就清晰了很多,答案很显然是true
七.运算符的优先级
虽然运算符有优先级,但是可以不用记忆,只要在可能存在歧义的代码中加上括号就好