4、 运算符
4.1 算术运算符
1、除法运算时,整型与整型相除,结果仍然是整型,不论你将结果赋值给一个 int 类型还是一个 double 类型,若想算出浮点型,必须在进行除法运算时,将除数和被除数中的一个变为浮点型参与运算。
2、结果的符号与被模数的符号相同。
3、自增一和自减一不会改变数据本身的数据类型。
/*
运算符之一:
算数运算符:+ - * / %(取余) (前)++ (后)++ (前)-- (后)-- +(连接运算)
*/
class AriTest
{
public static void main(String[] args)
{
//除号:/
int num1 = 12;
int num2 = 5;
int result = num1 / num2; //2
double result1 = (double)num1 / num2; //2.4000000953674316
double result2 = (num1 +0.0) / num2; //2.4
System.out.println(result); //结果保留整型
System.out.println(result1);
System.out.println(result2);
//取余运算:%
//结果的符号与被模数的结果相同。
int m1 = 12;
int n1 = 7;
System.out.println("m1 % n1 = " + m1 % n1); //5
int m2 = -12;
int n2 = 7;
System.out.println("m2 % n2 = " + m2 % n2); //-5
int m3 = 12;
int n3 = -7;
System.out.println("m3 % n3 = " + m3 % n3); //5
int m4 = -12;
int n4 = -7;
System.out.println("m4 % n4 = " + m4 % n4); //-5
//(前)++,先自增1,然后再赋值
//(后)++,先赋值,再自增1
//自增1不会改变本身变量的数据类型。
byte b1 = 127;
b1++;
System.out.println(b1); //-128,通过计算机底层的补码运算可以知道,0111,1111 --> 1000,0000
//(前)--,先自减1,后运算
//(后)--,先运算,后自减1
}
}
/*
随意给出一个整数,打印显示它的个位数,十位数,百位数的值。
格式如下:
数字xxx的情况如下:
个位数:
十位数:
百位数:
例如:
数字153的情况如下:
个位数:3
十位数:5
百位数:1
*/
class AriExer
{
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);
}
}
运行结果如下:
D:\MyDownloads\JAVA\my_java_code\day03>java AriExer
个位数:1
十位数:8
百位数:7
4.2 赋值运算符
*1、+= 、 -= 、 =、 /= 、%=不会改变数据本身的数据类型。
2、在数据类型为整型的情况下,num +=2 其实等价于 num = num + 2。
3、开发中,如果希望实现变量+1的操作,有几种方法?(前提:int num = 10)
方式一: num = num + 1;
方式二: num += 1; (超过1推荐方式二,不会改变数据类型)
方式三: num++; (只自增1推荐方式三)
/*
运算符之二:
赋值运算符:= += -= *= /= %=
*/
class SetValueTest
{
public static void main(String[] args)
{
int num1 = 10;
num1 += 2; //num1 = num1 +2;
System.out.println(num1);
int num2 = 12;
num2 %= 5; //num1 = num1 +2;
System.out.println(num2);
short num3 = 12;
//num3 = num3 +2; //编译不通过
num3 += num3; //不会改变数据本身的数据类型
System.out.println(num3);
//开发中,如果希望实现变量+1的操作,有几种方法?(前提:int num = 10)
//方式一:num = num + 1;
//方式二:num += 1; (超过1推荐方式二,不会改变数据类型)
//方式三:num++; (只自增1推荐方式三)
//思考3
int m = 2;
int n = 3;
n *= m++;
System.out.println("m=" + m);
System.out.println("n=" + n);
//思考4
int num4 = 10;
num4 += (num4++) + (++num4); //n = n + (n++) + (++n)= 10(n=10) + 10(n=11) + 12 (n=12);
System.out.println(num4);
}
}
运行结果如下:
D:\MyDownloads\JAVA\my_java_code\day03>java SetValueTest
12
2
24
m=3
n=6
32
4.3 比较运算符
1、> < >= <= :只能使用在数值类型的数据之间。
2、== 和 !=:不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间。
/*
运算符之三:
比较运算符:== != < > <= >=
结论:
1. 比较运算符的结果是布尔型,boolean型,
2. 区分 = 和 ==
*/
class CompareTest
{
public static void main(String[] args)
{
int i = 10,j=20;
System.out.println(i == j); //fause
System.out.println(i = j); //20,先将j赋值给i然后输出i
boolean b1 = true, b2 = false;
System.out.println(b1 == b2); //fause
System.out.println(b1 = b2); //fause
}
}
运行结果如下:
D:\MyDownloads\JAVA\my_java_code\day03>java CompareTest
false
20
false
false
D:\MyDownloads\JAVA\my_java_code\day03>
4.4 逻辑运算符
1、逻辑运算符操作的是布尔型的变量,位运算符操作的是整型变量。
2、区分 & 与 &&(开发推荐使用短路与,可以提高运行效率)
相同点: 两种运算结果相同;当符号左边是true时,都会执行符号右边运算
不同点: 当符号左边为false时,&执行右边运算,&&不执行右边运算。
3、区分 | 和 ||(开发中推荐使用短路或)
相同点: 运算结果相同,运算符左边为false时右边都要参与运算
不同点: 运算符左边为true时,||右边的不参与运算
/*
运算符之四:
逻辑运算符:& && | || ! ^
说明:
1.逻辑运算符都是操作布尔型的变量。
2.
*/
class LogicTest
{
public static void main(String[] args)
{
//区分 & 与 &&(开发推荐使用短路与)
//相同点:两种运算结果相同;当符号左边是true时,都会执行符号右边运算
//不同点:当符号左边为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);
boolean b2 = true;
b2 = false;
int num2 = 10;
if (b1 && (num2 ++ >0))
{
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num2 = "+ num2);
//区分 | 和 ||(开发中推荐使用短路或)
//相同点:运算结果相同,运算符左边为false时右边都要参与运算
//不同点:运算符左边为true时,||右边的不参与运算
}
}
D:\MyDownloads\JAVA\my_java_code\day03>java LogicTest
我现在在南京
num1 = 11
我现在在南京
num2 = 10
4.5 位运算符(了解)
1、左移空位都补零,右移正数高位全补0,负数高位全补1。
2、<<:在一定范围内,每向左移一位,相当于在原数字基础上 * 2
>>:在一定范围内,每向右移一位,相当于在原数字基础上 / 2
3、面试题:最高效的计算 2 * 8? 2<<3 8<1 移位比加法效率更高
/*
运算符之五:位运算符(了解)
1、位运算符操作的都是整型的数据
2、<<:在一定范围内,每向左移一位,相当于在原数字基础上 * 2
>>:在一定范围内,每向右移一位,相当于在原数字基础上 / 2
3、左移右边补0
右移左边补位,正数补0,负数补1
面试题:最高效的计算 2 * 8? 2<<3 8<1 移位比加法效率更高
*/
class BitTest
{
public static void main(String[] args)
{
int i = 21;
System.out.println("i << 2 :" + (i<<2));
System.out.println("i << 27 :" + (i<<27));
//练习:交换两个变量的值
int num1 = 10;
int num2 = 20;
System.out.println("num1 = " + num1 +", num2 = " + num2);
//方式一:定义一个临时变量,然后 num1--》temp ,num2 --》num1,temp --》num2
// int temp;
// temp = num1;
// num1 = num2;
// num2 = temp;
// System.out.println("num1 = " + num1 +", num2 = " + num2);
//方式二:不用定义临时变量,节省内存空间
//弊端:① 相加超出存储范围,② 有局限性:只能适用于数值类型
// 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);
}
}
D:\MyDownloads\JAVA\my_java_code\day03>java BitTest
i << 2 :84
i << 27 :-1476395008
num1 = 10, num2 = 20
num1 = 20, num2 = 10
4.6 三元运算符
1、结构: (条件表达式)?表达式1:表达式2;
2、 条件结果的表达式为boolean类型,根据表达式的结构执行表达式1 或者表达式 2,表达式1和表达式2必须可以统一为一个类型的,三元运算符可以嵌套使用,但是在不能提高运行效率的情况下不建议嵌套使用,会降低可读性。
3、凡是可以使用三元运算符的都可以使用 if-else 流程控制语句改写,反之不成立。
4、如果程序既可以使用三元运算符又可以使用if-else,优先使用三元运算符,原因:简洁,运行效率高。
class SanYuanTest
{
public static void main(String[] args)
{
//获取两个数中的最大值
int m = 12,n=5;
int max = (m > n)? m:n;
System.out.println("max = " + max);
double min = (m > n)? 2:1.0;
System.out.println("min = " + min);
int n1 = 10,n2 = 20,n3 = 30;
int max1 = (n1 > n2)? n1 : n2;
int max2 = (max1 > n3)? max1 : n3;
System.out.println("三个数中的最大数为:" + max2);
//在没有提高程序运行效率的情况下,不建议这样写。
//int max3 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2) : n3;
//System.out.println("三个数中的最大数为:" + max3);
}
}
D:\MyDownloads\JAVA\my_java_code\day03>java SanYuanTest
max = 12
min = 2.0
三个数中的最大数为:30
注:一般使用 ()手动提升运算优先级,不必死记硬背运算符优先级。