运算符
一. 算数运算符
概念:两个操作数进行计算
- +-*/%
一元运算符:只有一个操作数
- ++,--
前++:先++,再赋值
后++:先赋值,再++
public class TestOperation1{
public static void main(String[] args){
int a = 10;
int b = 3;
System.out.println(a / b);//求商 = 3
System.out.println(a % b);//求余 = 1
double d = 10.0;
int c = 3;
System.out.println(d / c);//求商3..33...
int num1 = 10;
num1++;//自增1
System.out.println(num1);//11
int num2 = 10;
num2--;//自减1
System.out.println(num2);//9
int num3 = 5;
//前++:先++,再打印自增后的值
//后++:先打印当前值,再++
System.out.println(++num3);//6
System.out.println(num3);//6
int num4 = 100;
//前++:先++,再赋值
//后++:先赋值,再++
int num5 = num4++;
System.out.println(num5);//100
System.out.println(num4);//101
}
}
二. 赋值运算符
概念:等号右边赋值给等号左边
- = 直接赋值
- += 求和后赋值
- -= 求差后赋值
- *= 求积后赋值
- /= 求商后赋值
- %= 求余后赋值
public class TestOperation2{
public static void main(String[] args){
int a = 10;//赋值运算符
a += 5;//在a基础上+5 a = a + 5
System.out.println(a);//15
int b =20;
b -= 3;//b = b - 3
System.out.println(b);//17
int c = 30;
c %= 4;//c = c % 4
System.out.println(c);//2
}
}
三. 关系运算符
概念:两个操作数进行比较
- >
- <
- >=
- <=
- ==
- !=
public class TestOperation3{
public static void main(String[] args){
int a = 10;
int b = 6;
System.out.println(a > b);//true
System.out.println(a < b);//false
System.out.println(a >= b);//true
System.out.println(a <= b);//false
System.out.println(a == b);//false
System.out.println(a != b);//true
}
}
四. 逻辑运算符
概念:两个boolean类型的操作数或表达式进行逻辑比较
- && 与(并且)
- || 或(或者)
- ! 非(相反)
public class TestOperation4{
public static void main(String[] args){
int javaScore =100;
int webScore = 99;
//比较两者是否相等
System.out.println(javaScore == webScore);//false
//分别判断两者是否为满分
System.out.println(javaScore == 100);//true
System.out.println(webScore == 100);//false
//一次性判断二者是否均为满分
System.out.println(javaScore == 100 && webScore == 100);//false
boolean result = javaScore == 100;
//java的成绩是满分吗?
System.out.println(result);//true
//java的成绩不是满分吗?
System.out.println(!result);//false
}
}
五. 位运算符
位运算符用于处理整型和字符型的操作数,对其内存进行操作,数据在内存中以二进制形式表示
- 主要有~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)、>>>(无符号右移)
public class TestOperation6 {
public static void main(String[] args) {
//位运算符(效率极高)
//主要有~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)、>>>(无符号右移)
/*
<< *2
>> /2
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0001 0000 16
0010 0000 32
0100 0000 64
1000 0000 128
*/
//1. 与(&) 如果两个二进制位都是1,则与用算的结果为1,其他全都为0
short a = 128;// 128二进制表现为1000 0000
short b = 129;// 129二进制表现为1000 0001
short c = -128;
System.out.println("a和b'与'的结果是: " + (a & b));// 128(1000 0000)
//2. 或(|) 如果两个二进制位都是0,则与运算的结果为0,其他全都为1
// 即只要其中一个数字的二进制位是1,这个二进制位的运算结果就为1
System.out.println("a和b'或'的结果是: " + (a | b));// 129(1000 0001)
//3. 非(~) 如果二进制是0,则取反为1,如果二进制是1,则取反为0
System.out.println("'非'a的结果是: " + ~a);// -129 (128 + 1 = 129 然后取负为-129)
System.out.println("'非'b的结果是: " + ~b);// -130 (129 + 1 = 130 然后取负为-130)
System.out.println("'非'c的结果是: " + ~c);// 127 (-128 + 1 = -127 然后取负为127)
//4. 异或(^) 如果二进制位相同,则结果为0,否则为1
System.out.println("a和b'异或'的结果是: " + (a ^ b));// 1(0000 0001)
//5. 左移
//移位可实现整数乘以或除以2的n次方的效果(左乘右除)
System.out.println(2 << 3);//16 (2的一次方 往左移动三位 等同于于2 * (2的三次方) = 2 * 8 = 16)
int i = 'a';
System.out.println(i);//97
System.out.println(i << 2);//388 (97 * 4 = 388)
//6. 右移
System.out.println(8 >> 2);//2 (8的一次方 往右移动两位 变为 8 / (2的平方) = 8 / 4 = 2)
}
}
/**
* 1. (正数(首位为0)的原反补码都一样)
* 2. (负数(首位为1)的 反码:符号位不变, 后面取反, 补码:反码基础上加1)
*
*
* 情况1:(求出补码首位为0(正数的原,反,补码都一样))
* step1 -> -2原码:1000 0010
* step2 -> -2反码:1111 1101
* step3 -> -2补码:1111 1110
* step4 -> 对-2的补码进行取反即可得到~(-2)的补码
* step5 -> ~(-2)补码:0000 0001
* step6 -> 由于符号位为0表示正数,因此补码和源码一样。转换为十进制就是1
*
* 情况2:求出补码首位为1(得将补码还原成原码)
* 假如符号位为1则得先将补码转换成反码,再转换成原码
* 例如:
* (6)原码:0000 0110
* (6)反码:0000 0110
* (6)补码:0000 0110
*
* ~(6)补码:1111 1001
* ~(6)反码:1111 1000
* ~(6)原码:1000 0111 (-7)
*
*
*/
六. 三元运算符
概念:将判断后的结果赋值给变量
- ?:(布尔表达式?结果1 :结果2)当表达式为真获得结果1,反之获得结果2
public class TestOperation5{
public static void main(String[] args){
//1.判断
//2.赋值
//布尔表达式?值1:值2
int javaScore = 100;
String result = javaScore == 100 ? "恭喜" : "加油";
System.out.println(result);//恭喜
int webScore = 99;
int result2 = webScore == 100 ? 666 : 111;
System.out.println(result2);//111
}
}
自动类型提升
进行算数运算时:
- 两个操作数有一个为double,计算结果提升为double
- 如果操作数中没有double,有一个为float,计算结果提升为float
- 如果操作数中没有float,有一个为long,计算结果提升为long
- 如果操作数中没有long,有一个为int,计算结果提升为int
- 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int
- 特殊:任何类型与String相加(+)时,实为拼接,其结果自动提升为String
public class TestTypeRaise{
public static void main(String[] args){
double d1 = 10.0;
int i1 = 5;
double d2 = d1 + i1;
System.out.println(d2);//15.0
//-----------------------------------------
float f1 = 5.0F;
short s1 = 20;
float f2 = f1 + s1;
System.out.println(f2);25.0
int i2 = 5;
long l1 = 10L;
long l2 = i2 + l1;
System.out.println(l2);//15
//特殊:String的字符串拼接
String str = "Hello";
int i3 = 123;
String str2 = str + i3;
System.out.println(str2);//Hello123
int javaScore = 100;
String str3 = "java的成绩是:" + javaScore;
System.out.println(str3);//java的成绩是:100
System.out.println("java的成绩是:" + javaScore);//java的成绩是:100
}
}