目录
java中的运算符可以分为,算术运算符,移位运算符,位运算符,关系运算符,逻辑运算符,还有条件运算符等等。
运算符
算术运算符
基本四则运算符,加减乘除模(+- */%)
- 都是双目操作符,进行使用的时候必须要有左右两个操作数。
- 除操作要想出现小数部分,要么左右操作数有一个是浮点数。要么左右两个整数操作数有一个和1.0f相乘,赋值给浮点数类型。
int a = 3;
int b = 2;
System.out.println(a / b);//结果是1
float c = 2;
System.out.println(a / c);//结果是1.5
float d = a*1.0f / b;
System.out.println(d);//结果是1.5
3. 除操作和取模操作右操作数不可以为0。
4.%不仅可以对整型取模,也可以对double类型取模,但没有意义,一般都是对整型取模的。
5.操作数两侧类型不一致时,向类型表示数范围大的提升。
6.取模操作,左右操作数是支持负数的。有负数进行取模操作的话,本质逻辑就是想办法往右操作数靠,然后剩下的就是模。-5 % 2 , 2*(-2) = -4,-5-(-4) = -1; -5%(-2) , -2 * 2 = -4, -5-(-4) = -1
public static void main(String[] args) {
System.out.println(5 % 2);//1
System.out.println(-5 % 2);//-1
System.out.println(5 % -2);//1
System.out.println(-5 % -2);//-1
}
增量运算符+=,-=,*=,/=, %=
该运算符只能用于变量
int a = 1;
a += 2; //相当于a = a + 2
a -= 2; //相当于a = a - 2
a *= 2; //相当于a = a * 2
a /= 2; //相当于a = a / 2
a +=(-=,/=,*=,%=) 1,与 a = a +(-,/,*,%) 1 的区别就是,左右操作符类型不匹配时,增量运算符自动进行了强制类型转换。有可能会造成数据的丢失,使用的时候需要注意。
自增/自减运算符++,--
++是给变量的值减1,--是给变量的值加1
int a = 1;
a++;
++a; //相当于 a = a + 1
a--;
--a; //相当于 a = a - 1
- 该运算符不可以用于常量
- 该运算符自动进行了强制类型转换
- 当变量自加(自减)赋给另一个元素的时候,前置加加(减减)自增完了的值去赋值,后置加加(减减)先用原来的值赋值再自加(减)。即前置加加(减减)先加后用,后置加加(减减)先用后加。
关系运算符
关系运算符主要有六个: == ,!= ,>,<,<=,>= ,关系运算符的计算结果都是布尔类型的值。
1.注意=和==的区别,java中=的含义是赋值操作,java中的==才是数学中的=,相等比较操作。
2.java不支持多次判断连着写。eg. 9 < a < 10这种写法是不支持的。要写多次判断,得用到逻辑运算符来进行连接。
逻辑运算符
逻辑运算符有&&,||,!,运算结果是boolean类型。
1.逻辑与&&
左右两个表达式都为真,结果才为真,否则结果为假。(即全真则为真)
2.逻辑或 ||
左右两个表达式都为假,结果才为假,否则结果为真。(即全假则为假)
3.逻辑非 !
!表达式,表达式为真,结果则为假;表达式为假,结果则为真。(可以理解为逻辑上的取反)
4. && 和 || 左右表达式必须都是boolean类型的结果。
&& 也叫短路与, ||也叫短路或。都遵循着短路求值的规则。
System.out.println((4 < 3) && (1 / 0 == 0));
//编译成功结果为false
System.out.println((4 > 3) && (1 / 0 == 0));
// 报错:Exception in thread "main" java.lang.ArithmeticException: / by zero
System.out.println((4 < 3) || (1 / 0 == 0));
//报错:Exception in thread "main" java.lang.ArithmeticException: / by zero
System.out.println((4 > 3) || (1 / 0 == 0));
// 编译成功结果为true
从上面的代码可以显然得出结论
&& 左表达式为假的时候,直接得出结果为假,不再判断右表达式。
|| 左表达式为真的时候,直接得出结果为真,不再判断右表达式。
5. & 和 |如果左右表达式的结果为boolean类型时,也表是逻辑运算,与&&和 ||不同的是,不支持短路求值,左右表达式都要进行判断。
位运算符
位运算符有&,|,~,^,其中只有~是单目操作符。
java中数据存储的最小单位是字节(byte/Byte),数据操作的最小单位是比特位。(bit)
位运算顾名思义就是按照二进制位,也就是比特位来进行运算。
进行位运算首先得将数据转换为二进制补码(因为数据在计算机中存储的形式是二进制补码)(不知道怎么转换的建议百度),然后进行按位运算。
1、按位与&:两个对应位的二进制都为1,则结果为1,否则结果则为0。
int a = 5;
int b = -3;
System.out.println(a & b);//结果为5
2.按位或 |:两个对应二进制为都为0,则结果为0,否则结果为1。
如何运算方面不做赘述,参考上面即可。
3.按位取反~:如果该位二进制位为0则转为1,如果该位二进制位1则转为0。
写出一个数的补码,然后按位取反。
4.按位异或^ :两个对应为二进制相同则为0,相异则为1。
移位运算
移位运算:<<,>>,>>>。都是二元运算。和上面的位运算符一样都是按照二进制比特位来算的。
1.左移 <<:最左边的比特位不要了,最右边补0。
左移丢掉的是符号位(java里面没有无符号数),所以可能左移之后正数会变成负数。
2.右移(有符号)>>:最右边的比特位不要了,最左边补符号位。
3.无符号右移>>>:最右边的比特位不要了,最左边补0。
4. 左移1位相当于原数字乘2;左移n位相当于原数字乘2的n次方。
右移1位相当于原数字除2;左移n位相当于原数字除2的n次方。
计算机移位的效率远高于计算乘除,当某个代码刚好乘除2的n次方的时候可以用移位运算来代替乘除运算。
移动负数位或者移位位数过大都没有意义。
条件运算符
表达式1 ?表达式2 :表达式3
是个三目运算符,是条件判断语句的简化。
表达式1结果为true时,整个表达式的值为表达式2的值,反之则为表达式3的值。
表达式不能单独存在,其产生的结果必须要被使用。
运算符优先级
运算符有优先级。你觉得可能会产生歧义的时候就加个括号。或者遇到的时候去百度一下。
程序的逻辑控制
完成任何事背后都是有逻辑控制的。比如人是先起床后刷牙而不是先刷牙后起床。而程序的运行也要有逻辑控制。
逻辑控制分为顺序结构,选择结构,循环结构。
顺序结构
就是按照代码书写的顺序一条一条执行。
System.out.println("a");
System.out.println("b");
//输出的结果为ab
而将两条代码顺序更换之后输出的结果则不一样了
System.out.println("b");
System.out.println("a");
//输出的结果为ba
分支结构
不同的情况指向不同的结果。
if语句
if (布尔表达式) {
//语句
} else if(布尔表达式) {
//语句
} else {
//语句
}
else if 和 else 语句都是可以省略的。根据使用场景灵活变通即可。
if后面可以不加{ },但此时只能控制一条语句。
分号问题
if(a < b)后面不加分号,则没有输出。
if(a < b)后面加分号之后,这个分号就成了if语句的语句体,而 { }中的代码块则成了一个与if无关的代码块。
悬垂else问题
else 和最近if匹配。匹配和是否与if对齐无关。
switch语句
switch (表达式){
case 常量值1:{
语句;
[break;]
}
.......
case 常量值n:{
语句;
[break;]
}
default:{
内容都不满足时执行的语句;
[break;]
}
}
1.多个case后面的常量值不可以重复。
2.switch括号里的表达式类型(表达式类型就是表达式返回值是什么类型的)只能是:byte,short,int,char,String常量串,枚举常量。(' '一对单引号括起来表示字符," "一对双引号括起来表示字符串。)
3.switch括号里的表达式类型可以和case后面的常量类型不一致,但是前提是这两个能够互相兼容,也就是可以互相转换。
但是即使编译器不报错也有可能出现bug。比如char和int类型那里。(因为字符1本质上是数字49),所以建议switch括号里的表达式类型和case后面的常量类型尽量保持一致。
4. 假如switch括号表达式的值是常量值m,那么程序就跳过前面的case语句,直接从case常量值m这条语句切入进去。这条语句控制的是在switch语句的代码块中这条语句下方的所有语句。但遇到break的时候,switch语句就会直接结束。
所以要保证每个case都只输出对应的结果,每个case最后都得加上break语句。
5.switch不能表达复杂的条件。
循环结构
while循环
while(循环条件){
循环语句;
}
1.while下面的语句可以不写{ },但此时只能控制一条语句。
2.while()直接加;表示while语句的结束,不能控制下面的语句。
3.while后的循环条件只能是布尔表达式。不可以是常量!
do..while循环
do{
循环语句;
}while(循环条件);
注意点和while循环一样
for循环
for (表达式1; 表达式2; 表达式3) {
语句;
}
表达式1:初始化循环变量,只在循环开始的时候执行,只执行一次。
表达式2:循环条件,满足循环条件就继续,不满足循环就结束。
表达式3:循环变量的更新。
注意点和while循环类似。
关键字break
break的功能是让循环提前结束,也可以说是跳出循环。
但是当循环嵌套的时候,break只能跳出它所在的最近的while循环体。
关键字continue
continue的功能是结束正在执行的这次循环,然后立即进入下次循环。
break 和 continue可以这样区分,你在日复一日的007,天天都很劳累。break就是你辞职了,不干了永远都可以休息了。continue就是你和主管请了一天假休息,但第二天还得继续007。
欢迎评论区交流。如果这篇blog对你有些许帮助,可以给我一个小赞吗?