运算符
1. 算数运算符:
代码示例:
package exercise.aritest;
public class AriTest {
public static void main(String[] args) {
//除号
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
System.out.println(result1);
int result2 = num1 / num2 * num2;
System.out.println(result2);
double result3 = num1 / num2; //此结果是讲整型运算结果赋值给double型变量
System.out.println(result3);
double result4 = num1 / num2 + 0.0;
double result5 = num1 / (num2 + 0.0);//除数已经是浮点型
double result6 = (double)num1 / num2;
double result7 = (double)(num1 / num2);
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);
int m2 = -12;
int n2 = 5;
System.out.println("m2 % n2 = " + m2 % n2);
int m3 = 12;
int n3 = -5;
System.out.println("m3 % n3 = " + m3 % n3);
int m4 = -12;
int n4 = -5;
System.out.println("m4 % n4 = " + m4 % n4);
//(前)++:先自增一,然后再运算。
//(后)++:先运算,然后再自增一。
int a1 = 10;
int b1 = ++a1;
System.out.println("a1 = " + a1 + ",b1 = " + b1);
int a2 = 10;
int b2 = a2++;
System.out.println("a2 = " + a2 + ",b2 = " + b2);
int a3 = 10;
++a3; //a3++
int b3 = a3;
//注意点:
short s1 = 10;
//s1 = s1 + 1; //编译失败,这里不满足变量提升规则
s1 = (short)(s1 + 1);//正确的
System.out.println(s1);
s1++; //自增一不会改变本身变量的数据类型,效率更高
System.out.println(s1);
//如果是byte
byte bb1 = 127;
bb1++;
System.out.println("bb1 = " + bb1);
//(前)--:先自减一,后运算。
//(后)--:先运算,后自减一。
int a4 = 10;
int b4 = --a4;
System.out.println("a4 = " + a4 + ",b4 = " + b4);
}
}
2. 赋值运算符:
-
符号:
=
、+=
、-=
、*=
、/=
、%=
(两侧数据类型不一致的时候,可以使用自动类型转换或使用强制类型转换原则进行处理) - 支持连续赋值
如果开发中,希望变量实现+2操作,有几种方法?
方式一、
num = num + 2;
方式二、
num += 2;
(推荐)(同样如果实现+1(-1)操作可以使用自增(自减)运算符,这种方式更为推荐,但是不能使用连续自增(自减)运算去实现+2(-2)操作。)eg:
num++++
这种就是编译不通过的情况
编程实例:
package exercise.aritest;
public class SetValueTest {
public static void main(String[] args) {
//赋值符号:=
int i1 = 10;
int j1 = 10;
int i2,j2;
//连续赋值
i2 = j2 = 10;
int i3 = 10,j3 = 20; //中间的逗号表示两个变量都是int类型
//***********************
int num1 = 10;
num1 += 2; //num1 = num1 + 2;
System.out.println(num1);
int num2 = 12;
num2 %= 5; //num2 = num2 % 5;
System.out.println(num2);
short s1= 10;
//s1 = s1 + 2;//编译不通过
s1 += 2; //这种写法不会改变变量本身的数据类型
System.out.println(s1);
}
}
3. 比较运算符(关系运算符):
- 比较运算符的结果都是布尔型,要么是
true
,要没事false
。 - 注意比较运算符当中的
==
和赋值运算符中的=
之间的区别。 - 经常用于条件判断当中。
代码实例:
package exercise.aritest;
public class CompareTest {
public static void main(String[] args) {
int i = 10;
int j = 20;
System.out.println(i == j); //false
System.out.println(i = j); //20//先将j赋值给i,然后再输出i
boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1);//false
System.out.println(b2 = b1);//true
}
}
4. 逻辑运算符:
-
逻辑运算符:
&
(逻辑与)、|
(逻辑或)、!
(逻辑非)、&&
(短路与)、||
(短路或)、^
(逻辑异或) - 操作的都是
boolean
类型的变量。
代码示例:
package exercise.aritest;
public 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(b2 && (num2++ > 0)) {//短路与和逻辑与之间的区别就在于如果第一个判断为false,后面就不在判断,因为只有前后两个命题都为true的时候才会判断为true。
System.out.println("我现在在北京");
}else {
System.out.println("我现在在南京");
}
System.out.println("num2 = " + num2);
//区分:| 和 ||
//相同点:| 和 || 的运算结果相同;当符号左边是false时,二者都会执行符号右边的运算
//不同点:当符号左边时true时,| 继续执行符号右边的运算,|| 不再执行符号右边的运算
boolean b3 = false;
int num3 = 10;
if(b3 | (num3++ > 0)) {
System.out.println("我现在在北京");
}else {
System.out.println("我现在在南京");
}
System.out.println("num3 = " + num3);
boolean b4 = false;
int num4 = 10;
if(b4 || (num4++ > 0)) {
System.out.println("我现在在北京");
}else {
System.out.println("我现在在南京");
}
System.out.println("num4 = " + num4);
}
}
5. 位运算符: 位运算是直接对整数的二进制进行的运算。(这里的移位运算请见计算机组成原理)
注意:只有>>>,没有<<<
- 移位运算符,可以让底数(2)倍乘法更为简单,效率更高
- 使用移位运算符还可以进行变量值的交换:
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
6. 三元运算符:
-
格式:
(条件表达式)?表达式1:表达式2;
如果条件表达式的值(结果为boolean
型变量)为true
,运算后的结果是表达式1;反之为表达式2。 - 表达式1和表达式2为同种类型。
代码示例:
package exercise.aritest;
public class SanYuanTest {
public static void main(String[] args) {
//获取两个整数的较大值。
int m = 12;
int n =5;
int max = (m > n) ? m : n;
System.out.println(max);
double num = (m > n) ? 2 : 1.0;
//(m > n) ? 2 : "n大";//编译不通过
System.out.println(num);
// *********************************
String maxStr = (m > n) ? "m大" : "n大";
String maxStr1 = (m > n) ? "m大" : ((m == n) ? "m和n相等" : "n大");
System.out.println(maxStr);
System.out.println(maxStr1);
//*************************************
//获取三个数的最大值
int n1 = 12;
int n2 = 30;
int n3 = -43;
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);
}
}
凡是可以使用三元运算符的地方都可以改写为if-else
;反过来不一定可行
如果既可以使用三元运算符,又可以使用if-else
,优先使用if-else
7. 运算符的优先级:(自上而下,由高变低)