运算符
1、 分类
功能作用的不同分类:
算数运算符
赋值运算符
比较运算符|关系运算符
逻辑运算符
条件运算符
位运算符 (了解)
操作数: 运算符左右两边的数据成为操作数 3+4
表达式: 运算符连接左右两边的操作数整体称为表达式
语句 : 以;结束
操作数的不同分类:
单目运算符|一元运算符: 操作数为1个 ++ -- +(正号) -(负号)
双目运算符|二元运算符: 操作数为2个 a+b - * /
三目运算符|三元运算符: 条件运算符
2、算数运算符
+ 1)正号
2)加法运算
3)字符串的连接符
当+左右两边一旦出现字符串,+作为字符串的连接符使用,最后会把左右两边的数据拼接成一整个字符串得到结果
- 1)符号
2)减法运算
*
/
% 模以 取模 求余数
操作1%操作数2 当操作数1<操作数2时候,结果为操作数1
++ --
**注意:**
一个字符型数据参与运算(四则运算),会前转为十进制的整数再运算--> Unicode,ASCII
public class Class001_Operator{
public static void main(String[] args){
//int i = 1;
//System.out.println("i="+i); //"i=1"
//System.out.println("i = " + i); //"i=1"
System.out.println('a' + 1); //98
System.out.println("hello" + 'a' + 1); //"helloa1"
System.out.println('a' + "hello" + 1); //"ahello1"
System.out.println('a' + 1 + "hello" ); //"98hello"
System.out.println(3%5); //3
System.out.println(12%5); //2
//编译不报错,运行时期会遇到一个异常 数学异常
//System.out.println(12/0); //java.lang.ArithmeticException: / by zero
int i = 3;
int result = i++ + ++i + i++ + ++i;
System.out.println(i); //
System.out.println(result); //
}
}
3、++ – 一元运算符
++ 自增 自身+1
a++ ==> a = a+1;
++a ==> a = a+1;
– 自减 自身-1
a-- --> a = a-1;
--a --> a = a-1;
只影响操作数本身
++放在操作数的前面或者后面,都是自身+1
--放在操作数的前面或者后面,都是自身-1
影响其他值(赋值,输出,表达式计算)
++|–放在操作数的前面,先+1|-1,然后再去运算
++|–放在操作数的后面,先参与运算,然后再自身+1|-1
public class Class002_Operator{
public static void main(String[] args){
int a = 1;
System.out.println(a);
//只影响操作数本身
a++;
System.out.println(a);
--a;
System.out.println(a);
//影响其他值
int b = ++a;
System.out.println(a); //2
System.out.println(b); //2
System.out.println(a--); //2
System.out.println(a); //1
int c = a++ + 5;
System.out.println(a); //2
System.out.println(c); //6
}
}
4、赋值运算符
赋值运算符
基础赋值运算符 =
=是java中唯一一个自右向左运算的符号
扩展赋值运算符 (算数运算符+基础赋值运算符)
+= a+=b ==> a = a+b;
-=
*=
/=
%= a%=b ==> a = a%b;
缺点:
不直观
优点:
提高执行效率,编译期会自动优化为扩展赋值运算符
自动做强制类型转换
public class Class003_Operator{
public static void main(String[] args){
int i = 1;
int zhangsan = 100;
int lisi = 90;
int result =0;
result+=zhangsan; //result = result + zhangsan;
result = result + lisi;
System.out.println(result);
short s = 100;
//s = (short)(s + 5);
s += 5;
//++可以实现自动做强制类型转换
s++;
System.out.println(s);
}
}
5、比较运算符
比较运算符|关系运算符
> < >= <=
只能针对数值型|能够转为数值型的数据进行操作
== !=
可以针对任意类型数据进行操作
结果为boolean类型的运算符
public class Class003_Operator{
public static void main(String[] args){
int a = 5;
int b = 7;
System.out.println(a>=b); //false
System.out.println(a+2 >=b); //true
System.out.println(a+3 != b-1); //true
System.out.println('a'+3 != 'b'-1); //true
System.out.println('a'<'b'); //true
String name1 = "zhangsan";
String name2 = "zhangsan";
System.out.println(name1==name2);
//练习题 对下面代码进行注释
double d=10/3; //3.0
a=10/3; // 3
System.out.println(a==d); // true
System.out.println(a); // 3
System.out.println(d); // 3.0
d=10/3.0; //3.333
a=10/3; //3
System.out.println(a==d); // false
System.out.println(a); // 3
System.out.println(d); // 3.333
}
}
6、逻辑运算符
逻辑运算符:
& 与
一个为false就是false,两个都为true,结果才为true
| 或
一个为true就是true,两个都为false才是false
! 非 取反
!true->false
!false->true
^ 异或
相同为false,不同为true
短路运算符 : 当左边的操作数的值就能够决定最终的结果,右边操作数将不会执行
短路与 : 与单与逻辑相同
短路或 : 与单或的逻辑相同
推荐使用短路运算符
两边的操作数为boolean类型
结果为boolean类型结果
public class Class005_Operator{
public static void main(String[] args){
System.out.println("---------------&---------------");
System.out.println(true&false); //false
System.out.println(true&true); //true
System.out.println(false&true); //false
System.out.println(false&false); //false
System.out.println("---------------|---------------");
System.out.println(true|false); //true
System.out.println(true|true); //true
System.out.println(false|true); //true
System.out.println(false|false); //false
System.out.println("---------------!---------------");
System.out.println(!false); //true
System.out.println(!true); //false
System.out.println("---------------^---------------");
System.out.println(true^false); //true
System.out.println(true^true); //false
System.out.println(false^true); //true
System.out.println(false^false); //false
System.out.println("---------------&&---------------");
System.out.println(true&&false); //false
System.out.println(true&&true); //true
System.out.println(false&&true); //false
System.out.println(false&&false); //false
System.out.println(false && 5/0 == 0); //false
//System.out.println(false & 5/0 == 0);
System.out.println("=============练习=================");
int a=10;
int b=9;
System.out.println(a>b & ++b>a); //
System.out.println("a="+a+",b="+b); //
System.out.println(a<b | b<a); //
System.out.println(!(a>b ^ a>9)); //
System.out.println(10<5 && 10/0==0); //
}
}
7、条件运算符
boolean表达式 ?值1 : 值2;
boolean表达式 : 值为boolean类型的表达式
1)计算表达式,得到一个boolean结果
2)如果结果为true,条件运算符结果为值1
3)如果结果为false,条件运算符结果为值2
public class Class006_Operator{
public static void main(String[] args){
//1)判断a是否>0 大于0或者不大于0
int a = 10;
int b = 0;
int c = 15;
String str = a > 0 ? "大于0" : "不大于0";
System.out.println(str);
//判断变量a是否为偶数
str = a%2==0 ? "偶数" : "奇数";
System.out.println(str);
//求a,b中最大得到值
int max = a>b ? a : b;
System.out.println(max);
System.out.println(a>b ? "a" : "b");
//定义三个变量,求三个变量中最大的那个值
max = a>b?a:b;
max = max>c?max:c;
System.out.println(max);
max = a>b && a>c ? a : b>c ? b : c;
System.out.println(max);
//条件运算符: 具有自右向左的结合性
//算数运算默认自左向右结合 a-b+c;
//赋值运算具有自由向左的结合性 x=y=z;
boolean x = true?true:false?false:false;
boolean y = (true?true:false)?false:false; //自左向右结合
boolean z = true?true:(false?false:false); //自右向左结合
//y=false z=true
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
8、位运算符
把操作数转为二进制,对二进制的操作数进行某种规则的运算,最终得到的二进制的结果再转为十进制
一下三个 运算符,当操作数为boolean类型作为逻辑运算符,操作数为整数,作为位运算符
& : 两边的操作数转为二进制,同一位置的两个数,一个为0就是0,两个都为1才1,结果转为十进制
| : 两边的操作数转为二进制,同一位置的两个数, 一个为1就是1,两个都为0才是0,结果转为十进制
^ : 两边的操作数转为二进制,同一位置的两个数, 相同为0,不同为1,结果转为十进制
9、位移运算符
<< 左移 : 第一个操作数转为二进制,向左移动第二个操作数个位置,空位补0,结果转为十进制
>> 右移 : 第一个操作数转为二进制,向右移动第二个操作数个位置,移出的位置舍弃,结果转为十进制
规律:
左移: 相当于*2的倍数 a<<b ==> a*2^b
右移: 相当于/2的倍数 a>>b ==> a/2^b
位运算符的执行效率较高,因为针对二进制的数据
当想要对2或者2的倍数进行乘除,建议使用位移运算符效率更高
public class Class007_Operator{
public static void main(String[] args){
System.out.println(3&2); //2
System.out.println(3|2); //3
System.out.println(3^2); //1
System.out.println(3<<2); //12
System.out.println(12>>2); //3
System.out.println(9>>2); //2
}
}