一、运算符
.运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符
1. 运算符之一:算术运算符
注意:
-
7%5 其中7是被除数,5是除数 。 余数正负号与被除数相同
-
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是 负数则不可忽略。此外,取模运算的结果不一定总是整数。
-
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只 保留整数部分而舍弃小数部分。
-
“+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55 ?
举个例子:除数/ 、取模% +±- **
package com.atguigu.java;
public class HelloWorld {
public static void main(String[] args){
//除号:/
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
System.out.println(result1); //2
int result2 = num1 / num2 * num2; //10
System.out.println(result2);
double result3 = num1 / num2;
System.out.println(result3); //2.0
double result4 = num1 / num2 + 0.0; //2.0
double result5 = num1 / (num2 + 0.0);//2.4
double result6 = (double)num1 / num2;//2.4
double result7 = (double)(num1 / num2); //2.0
System.out.println(result4);
System.out.println(result5);
System.out.println(result6);
System.out.println(result7);
//%:取余运算
//结果的符号与被取模数的符号相同
//开发中,经常使用%来判断能否被除尽的情况
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
}
}
结果
public class HelloWorld {
public static void main(String[] args){
//(前)++
//(后)++
int a1 = 10;
int b1 = ++a1;
System.out.println("a1 = " + a1 + ", b1= " + b1 );//a1 = 11, b1= 11
int a2 = 10;
int b2 = a2++;
System.out.println("a2 = " + a2 + ", b2= " + b2 );//a2 = 11, b2= 10
//注意:
short s1 = 10;
//s1 = s1 + 1
//s1 = (short)(s1 + 1);//正确的
s1++;//自增1不会改变本身变量的数据类型
System.out.println(s1); //11
//(前)--先自减1,后运算
//(后)--先运算,后自减1
int a3 = 10;
int b3 = --a3;
System.out.println("a3 = " + a3 + ", b3= " + b3 );//a3 = 9, b3= 9
int a4 = 10;
int b4 = a4--;
System.out.println("a4 = " + a4 + ", b4= " + b4 );//a4 = 9, b4= 10
}
}
结果
练习
(1)算术运算符:自加、自减 **
public class HelloWorld {
public static void main(String[] args){
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print("i="+i);
System.out.println(", i1="+i1); //i=10, i1=11
i = ++i1;
System.out.print("i="+i);
System.out.println(", i1="+i1); //i=12, i1=12
i = i2--;
System.out.print("i="+i );
System.out.println(", i2="+i2); //i=20, i2=19
i = --i2;
System.out.print("i="+i);
System.out.println(", i2="+i2); //i=18, i2=18
}
}
(2)练习2
public class HelloWorld {
public static void main(String[] args){
int num = 187;
int bai = num / 100;
int shi = num % 100 / 10;
int ge = num % 10;
System.out.println("百位数为: " + bai);
System.out.println("十位数为: " + shi);
System.out.println("个位数为: " + ge);
}
}
2.运算符之二:赋值运算符
- 注意:使用赋值运算符不会改变本身的数据类型。
举个例子
package com.atguigu.java;
public class HelloWorld {
public static void main(String[] args){
//赋值符号:=
int i1 = 10;
int j1 = 10;
int i2,j2;
//连续赋值
i2 = j2 = 10;
int i3 = 10 ,j3 = 20;
System.out.println("i1= "+i1 + ", i2= "+ i2 + ", i3= "+ i3); //i1= 10, i2= 10, i3= 10
System.out.println("j1= "+j1 + ", j2= "+ j2 + ", j3= "+ j3); //j1= 10, j2= 10, j3= 20
//*****************************
int num1 = 10;
num1 += 2; //不会改变变量本身的数据类型
System.out.println(num1); //12
int num2 = 12;
num2 %= 5;
System.out.println(num2); //2
}
}
结果:
.
练习
思考1:
①不通过,2通过
思考2
int i = 1;
i *= 0.1;
System.out.println(i); //0
i++;
System.out.println(i); //1
思考3
int m = 2;
int n = 3;
n *= m++;
System.out.println("m=" + m); //3
System.out.println("n=" + n); //6
思考4
int n = 10;
n += (n++) + (++n); //n=n+(n++)+(++n) 即 n =10+10+12
System.out.println(n); //32
.
3.运算符之三:比较运算符
举例子:
int i = 10;
int j = 20;
System.out.println(i == j); //false
System.out.println(i = j); //20
boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1); //false
System.out.println(b2 = b1); //true
4.运算符之四:逻辑运算符
举个例子1:& 与&&
boolean b1 = true;
int num1 = 10;
if(b1 & (num1++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num1 = " + num1);
//结果 : 我是好人 num1=11
boolean b2 = true;
int num2 = 10;
if(b2 && (num2++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num2 = " + num2);
//结果: 我是好人 num1=11
改变一下:b1改成false
boolean b1 = true;
b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num1 = " + num1);
//结果 : 我是坏人 num1=11
boolean b2 = true;
b2 = false;
int num2 = 10;
if(b2 && (num2++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num2 = " + num2);
//结果 : 我是坏人 num1=10
//b2这一段相当于电路短路,前面为fale,后面的运算都忽略掉了
区分& 与&&
- 相同点1:& 与&&的运算结果相同
- 相同点2: 当符号左边是true时,二者都会执行符号右边的运算
- 不同点:当符号左边是false 时,& 继续执行符号右边的运算。&&不再执行符号右边的计算。
- 开发中,推荐使用&&
举个例子2:| 与 ||
boolean b3 = false;
//b3 = false;
int num3 = 10;
if(b3 | (num3++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num3 = " + num3);
//结果:我是好人 , num3 = 11
boolean b4 = false;
//b4 = false;
int num4 = 10;
if(b4 || (num4++ > 0)){
System.out.println("我是好人");
}else {
System.out.println("我是坏人");
}
System.out.println("num4 = " + num4);
//结果: 我是好人 , num4 = 11
区分:| 与 ||
- 相同:1: | 与 || 的运算结果相同
- 相同点2:当符号左边是false时,二者都会执行符号右边的运算
- 不同点3:当符号左边是true时,| 继续执行符号右边的运算,而||不再执行符号右边的运算。
- 开发中,推荐使用||
练习
练习1
int x = 1;
int y=1;
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+ x +" ,y="+y);
//结果为:x=2 ,y=2
练习2
int x = 1, y = 1;
if(x++==2 && ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);
//结果为:x=2,y=1
//原因:&& 第一个为false ,第二个不进行运算。
练习3:
int x = 1,y = 1;
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);
//结果:x=7,y=2
练习4
int x = 1,y = 1;
if(x++==1 || ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);
//运算结果为:x=7,y=1
// 原因:|| 左边为真时,右边不参与计算
面试题:
5.运算符之五:位运算符
要求:能看的懂
结论:
1.位运算符操作的都是整型的数据
2.<<:在一定范围内,每向左移1位,相当于 * 2
>> :在一定范围内,每向右移1位,想当于 / 2
int i = 21;
System.out.println("i << 2 : "+ (i << 2));
System.out.println("i << 3 : " + (i << 3));
System.out.println("i << 27: " + (i << 27));
//结果
//i << 2 : 84
//i << 3 : 168
//i << 27: -1476395008
int i = 21;
i = -21;
System.out.println("i << 2 : "+ (i << 2));
System.out.println("i << 3 : " + (i << 3));
System.out.println("i << 27: " + (i << 27));
//结果
// i << 2 : -84
//i << 3 : -168
//i << 27: 1476395008
面试题:
最高效方式的计算 2* 8 ?
答案: 2 << 3 或 8 << 1
6运算符之六:三元运算符
举例:
int m = 12;
int n = 5;
int max = (m > n)? m : n ;
System.out.println(max);
// 结果:12
练习:交换两个变量
int num1 = 10 ;
int num2 = 20 ;
System.out.println("num1 = " + num1 + " ,num2 = "+ num2);
//方式一:定义临时变量方式
//推荐的方式
int temp = num1;
num1 = num2;
num2 = temp;
//方式二:好处:不用定义临时变量
//弊端:①相加操作可能超出存储范围 ②有局限性:只能适用于数值类型
//num1 = num1 + num2;
//num2 = num1 - num2;
//num1 = num1 - num2;
//方式三:使用位运算符
//有局限性:只能适用于数值类型
//num1 = num1 ^ num2;
//num2 = num1 ^ num2;
//num1 = num1 ^ num2;
System.out.println("num1 = " + num1 + ", num2= " + num2);
//结果:
//num1 = 10 ,num2 = 20
//num1 = 20, num2= 10