一、运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
1>算术运算符:+、-、+、-、*、/、%、(前)++、(后)++、(前)--、(后)--
经典代码:
1.除法/
int num1 = 12;
int num2 = 5;
int result1 = num1/num2;
System.out.println(result1);//2
double result2 = num1/num2+0.0;
System.out.println(result2);//2.0
double result3 = num1/(num2+0.0);
System.out.println(result3);//2.4
double result4 = (double)num1/num2;
System.out.println(result4);//2.4
double result5 = (double)(num1/num2);
System.out.println(result5);//2.0
double result6 = num1/num2*num2;
System.out.println(result6);//10.0
2.取模 %
①取模运算的结果的符号和被取模数的符号相同。
②开发当中经常运用一个值能否被除尽
int m1 = 12;
int n1 = 5;
System.out.println("m1 % n1 = "+ m1 % n1);//2
int m2 = -12;
int n2 = 5;
System.out.println("m2 % n2 = "+ m2 % n2);//-2
int m3 = 12;
int n3 = -5;
System.out.println("m3 % n3 = "+ m3 % n3);//2
int m4 = -12;
int n4 = -5;
System.out.println("m4 % n4 = "+ m4 % n4);//-2
3.(前)++ 先+1,后运算
4.(后)++ 先运算,后+1
int x1= 10;
int y1 = ++x1;
System.out.println("x1 = "+x1+",y1 = "+y1);//11,11
int x2= 10;
int y2 = x2++;
System.out.println("x2 = "+x2+",y2 = "+y2);//11,10
5.(前)--:先-1,后运算
6.(后)--:先运算,后-1
int x3= 10;
int y3 = --x3;
System.out.println("x3 = "+x3+",y3 = "+y3);//9,9
int x4= 10;
int y4 = x4--;
System.out.println("x4 = "+x4+",y4 = "+y4);//9,10
注意:自增运算不会改变变量的数据类型。
short s1 = 10;
s1 = s1 +1; //编译错误
s1++; //自增运算不会改变变量的数据类型。
System.out.println(s1);
7.经典例题:随意给出一个整数,打印显示它的个位数,十位数,百位数的值。
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个三位数字:");
int i1 = scan.nextInt();
int bai = i1/100;
int shi = i1/10%10;
int ge = i1%10%10;
System.out.println(i1 + "的百位数为:"+ bai);
System.out.println(i1 + "的十位数为:"+ shi);
System.out.println(i1 + "的个位数为:"+ ge);
运行结果:
2>赋值运算符:= 、+=、 -= 、*=、 /=、%=
1.赋值:=、+=
int i1 = 10;
int j1 = 10;
int i2,j2;
i2 = j2 =10;
int i3,j3 = 10;
System.out.println("**************");
//+=
int i4 = 10;
i4 += 2;
System.out.println(i4);//12
注意:赋值运算符不会改变变量本身的数据类型
short s1 = 14;
//s1 = s1 + 5; //编译错误
s1 += 5;
System.out.println(s1);//19
3>比较运算符(关系运算符):==、!=、>、<、>=、<=、 instanceof(在面向对象章节中讲解)
int i1 = 10;
int j1 = 20;
System.out.println(i1 == j1);//false
System.out.println(i1 = j1);//20
boolean b1 = true;
boolean b2 = false;
System.out.println(b1 == b2);//false
System.out.println(b2 = b1);//true
【特别说明】
1.比较运算符的结果都是boolean类型
2.注意:== 和 = 的区别
3.> < >= <= 只能运用在数值类的数据中。
4.== 和 != 不仅可以运用在数值型的数据,也可以用于引用数据类型。
例如:
Account a = new Account(1000);
Account b = new Account(1000);
boolean b1 = (a == b);//false
boolean b1 = (a != b);//true
4>逻辑运算符:&—逻辑与、 | —逻辑或、 !—逻辑非、^ —逻辑异或、 && —短路与、 || —短路或
具体规则如图:
结论:①与运算(&)只要有一个为false,那么结果为false,必须都是true时,结果才是true。
②或运算 (|)只要有一个为true,那么结果就为true,必须全是false,结果才是false。
③非运算(!)本身为true的结果为false,本身为false的结果取true。
④异或运算(^)两个不相同的布尔型结果为true,相同的布尔型结果为false
注意:逻辑运算符被操作的变量都是boolean型。结论也是boolean型。
逻辑与和短路与的异同:
①相同点:当左边为true时,逻辑与和短路与都会计算右边的值。
②不同点:当左边为false时,短路与不会计算右边的值,而逻辑与会继续计算右边的值。
逻辑与:
boolean b1 =true;
b1 = false;
int i1 = 10;
if(b1 & (i1++>0)){
System.out.println("我在新疆!");
}else{
System.out.println("我在海南!");
}
System.out.println("i1= "+ i1);//11
运算结果:此时变量i自增完成结果为11
短路与 :
boolean b1 =true;
b1 = false;
int i1 = 10;
if(b1 && (i1++>0)){
System.out.println("我在新疆!");
}else{
System.out.println("我在海南!");
}
System.out.println("i1= "+ i1);//11
运算结果:此时变量i没有完成自增,结果为10.
逻辑或和短路或的异同:
①相同点:当左边为false时,逻辑或和短路或都会计算右边的值。
②不同点:当左边为true时,短路或不会计算右边的值,而逻辑或会继续计算右边的值。
逻辑或:
boolean b3 =true;
int i3 = 10;
if(b3 | (i3++>0)){
System.out.println("我在新疆!");
}else{
System.out.println("我在海南!");
}
System.out.println("i3= "+ i3);//11
运行结果:此时左边b3为true,逻辑或会计算右边,i3完成自增运算,值为11.
短路或:
boolean b3 =true;
int i3 = 10;
if(b3 || (i3++>0)){
System.out.println("我在新疆!");
}else{
System.out.println("我在海南!");
}
System.out.println("i3= "+ i3);//10
运行结果:此时左边b3为true,短路或不会计算右边,i3没有完成自增运算,值仍为10
5>位运算符:
经典代码:
int i1 = 21;
//i1 = -21;
System.out.println("i1<<2:"+(i1 << 2));//84 //-84
System.out.println("i1<<3:"+(i1 << 3));//168 //-168
int i2 = 48;
System.out.println("i2>2:"+(i2 >> 2));//12
System.out.println("i2>>3:"+(i2 >> 3));//6
int m = 12 ;
int n = 5;
System.out.println("m&n:"+(m & n));//4
System.out.println("m|n:"+(m | n));//13
System.out.println("m^n:"+(m ^ n));//9
int x = 13 ;
int y = 7;
System.out.println("x&y:"+(x & y));//5
System.out.println("x|y:"+(x | y));//15
System.out.println("x^y:"+(x^ y));//10
结论:①左移"<<"
在一定范围内,数值每左移一位,等于该数值*2
②右移">>"
在一定范围内,数值每右移一位,等于该数值/2
经典例题:你能否写出最高效的2 * 8的实现方式?
答案:① 2 << 3 ② 8 << 1
6>三元运算符:(条件表达式)?表达式1:表达式2;
说明:
1.当条件表达式为true时,结果为表达式1;当条件表达式为false时,结果为表达式2。
2.注意:①条件表达式的结果是boolean类型。
②表达式1与表达式2的数据类型需要能统一为同一数据类型。
3.凡是可以用三元运算符表达的都可以改写为if-else结构。【反之不成立】
4.如果程序既可以用三元也可以if-else那么优先三元。原因:简洁,执行效率高。
经典例题:
1.判断两个值得最大值
Scanner scan = new Scanner(System.in);
System.out.print("请输入第一个整数:");
int m = scan.nextInt();
System.out.print("请输入第二个整数:");
int n = scan.nextInt();
int max = (m>n)?m:n;
System.out.println("最大值为" + max);
运行结果:
2.获取三个数中的最大值
Scanner scan = new Scanner(System.in);
System.out.print("请输入第一个整数:");
int m = scan.nextInt();
System.out.print("请输入第二个整数:");
int n = scan.nextInt();
System.out.print("请输入第三个整数:");
int i = scan.nextInt();
int max = (m>n)?((m>i)?m:i):((n>i)?n:i);
System.out.println("最大值为" + max);
运行结果: