1、什么是运算符
就是对常量或者变量进行操作的符号,如:+,-,*,/
表达式:
用运算符把常量或者变量连接起来的,符合java语法的式子就是表达式。
2、 算术运算符
2.1、基本四则运算符+ - * / %
都是二元运算符,也就是说使用时需要左右两边有操作数。
+ - *
:跟小学数学中一模一样没有任何区别,这里不做介绍。
/
整除
两数相除结果只能得到整除,如果结果想要是小数,必须要有小数参与。但是代码中,如果有小数参与计算,结果可能不精确。
例子:
public static void main(String[] args) {
System.out.println(1.1 + 1.01);
System.out.println(1.1 + 1.1);
System.out.println(10.0 / 3);
System.out.println(10 / 3);
}
【运行结果】
2.1100000000000003
2.2
3.3333333333333335
3
%
取余(取模)
- 两边的操作数不仅可以是整数,也可以是小数,但是对小数没有意义,一般都是对整数取模
- 求模结果的正负号由第一个运算符的正负号决定。
- 如果操作数中存在小数,则结果为小数否则结果为整数
例子:
System.out.println(10%3);//1
System.out.println(10%-3);//1
System.out.println(-10%3);//-1
//求模结果的正负号由第一个运算数的正负号决定
System.out.println(-10%-3);//-1
//java中可以对小数求余数,但是没有意义,一般都是对整数取模
System.out.println(11.5%2);//1.5
System.out.println(-11.5%2);//-1.5
System.out.println(9.0 % 3);//0.0
//如果操作数中存在小数,则求余结果为小数,否则结果是整数
System.out.println(9 % 3);//0
【注意】
做除法和取模时,右操作数不能为 0
int a = 1;
int b = 0;
System.out.println(a/b);
会报出错误,称为异常。如下所示:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test01.main(Test01.java:31)
两侧操作数类型不一致时,向类型大的提升,也就是发生自动类型转换(隐式转换)。
System.out.println(1+0.2);
//+左侧是int,右侧是double,在加之前int被提升为double,所以输出1.2
【练习】
需求:键盘录入一个三位数,拆分为个位,十位,百位,打印在控制台上
【代码示例】
import java.util.Scanner;
public static void main(String[] args) {
//获取一个数的每一位
//1.键盘录入一个三位数
//导包 --- 创建对象 --- 接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int number = sc.nextInt();//123
//2.获取这个三位数的个位、十位、百位并打印出来
int ge = number % 10;
int shi = number / 10 % 10;
int bai = number / 100 % 10;
//3.输出结果
System.out.println(ge);
System.out.println(shi);
System.out.println(bai);
}
2.1.1、字符串的拼接+
- 当
+
符号前或者后出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。 - 当连续进行
+
操作时,从左到右逐个执行的。
例子1:
"123"+123;
此时进行的是字符串的拼接,结果是"123123"
例子2:
1+"23"+56;
先进行字符串的拼接,结果是"123"
,然后和56
进行字符串拼接,最终结果是"12356"
例子3:
1+56+"89"+1+2;
先进行的是整数的加法运算,结果是57
,之后和字符串"89"
进行拼接,结果是"5789"
,然后依次和后面的1 2
进行拼接,最终结果是"578912"
。
例子4:
String name = "小明";
System.out.println("我的名字是" + name);
结果是:我的名字是小明
2.1.2、字符的+
- 字符 + 字符
- 字符 + 数字
以上两种情况出现时,会拿着字符到计算机内置的ASCII码表中去查字符对应的数字,然后再进行数值的计算。
常用的ASCII码值:
‘a’----97
‘A’----65
例子1:
char a = 'a';
System.out.println(a);
System.out.println(a + "字符串");//字符串的拼接
System.out.println(a + 1);//字符的+
【运行结果】
a
a字符串
98
例子2:
char c1 = 'a';
char c2 = 'b';
System.out.println(c1+c2);
【运行结果】
195
2.2、赋值运算符= += -= *= /= %=
2.2.1、=
赋值运算符
=
,也就是将等号右边的结果赋值给左边的变量。
例子:
//1.最为简单的赋值运算符用法
int a = 10;//就是把10赋值给变量a
System.out.println(a);
//2.如果等号右边需要进行计算。
int b = 20;
int c = a + b;//先计算等号右边的表达式,把计算的结果赋值给左边的变量
System.out.println(c);
//3.特殊的用法
a = a + 10;//先计算等号右边的,把计算的结果赋值给左边的变量
System.out.println(a);//20
2.2.2、增量运算符+= -= *= /= %=
运算规则:
就是把左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响。
例子:
public static void main(String[] args) {
//扩展赋值运算符
int a = 10;
int b = 30;
a += b;//把左边和右边相加,再把最终的结果赋值给左边,对右边没有任何影响
// 相当于 a = a + b;
System.out.println(a);//40
System.out.println(b);//30
}
【注意】
增量运算符会帮助进行强制类型转换
long a1 = 100L;
int a2 = 200;
//a2 = a1+a2;//error,因为等式右边计算后是long类型,与左边不同
a2 += a1;//没有报错,因为运算符会实现类型转换
//具体实现:a2 = (int)(a2 + a1),也就是会实现强制类型转换
System.out.println(a2);//300
2.3、自增/自减运算符++ --
++
:就是把变量里面的值+1
--
:就是把变量里面的值-1
例子1:
//++
int a = 10;
a++;//就是让变量a里面的值 + 1
System.out.println(a);//11
++a;//就是让变量a里面的值 + 1
System.out.println(a);//12
例子2:
int a = 10;
int b = a++;//先将a的值赋给b,然后a的值++
System.out.println(a);//11
System.out.println(b);//10
int a2 = 10;
int b2 = ++a2;//先将a2的值++,然后将结果赋值给b2
System.out.println(a2);//11
System.out.println(b2);//11
【注意】
- 如果单独使用,【前置++】和【后置++】没有任何区别
- 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
- 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
3、关系运算符
又叫比较运算符,其实就是拿着左边跟右边的值进行判断。
关系运算符主要有六个:== != < > <= >=
其计算结果是true
或者false
【注意】
- 如果需要多次判断时,不能连着写,如:
int a = 4;3<a<5
。和 C语言中不同,因为 C语言中的可以用 0 或 1 表示false
或者true
,但是在 java 中,3<a
结果是true
然后是true < 5
两者不能进行比较,会报错。 - 关系运算符最终结果一定是布尔类型,要么是
true
要么是false
。
4、逻辑运算符‼️
有三种运算符,分别是:&& || !
运算结果都是boolean
类型。
4.1、逻辑与&&
语法规则:表达式1 && 表达式2
,左右表达式必须是boolean
类型的结果
只有两个表达式同时为真,最后结果才为真,有 1 个为假最后结果就是假。
例子:
public class Main{
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2); //左为真 且 右为真 则结果为真
System.out.println(a == 1 && b > 100); // 左为真 但 右为假 则结果为假
System.out.println(a > 100 && b == 2); // 左为假 但 右为真 则结果为假
System.out.println(a > 100 && b > 100); // 左为假 且 右为假 则结果为假
}
}
4.2、逻辑或||
语法规则:表达式1 || 表达式2
,左右表达式必须是boolean
类型的结果
只要有一个为真结果就是真,只有两个表达式都为假结果才是假。
例子:
public class Main{
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2); // 左为真 且 右为真 则结果为真
System.out.println(a == 1 || b > 100); // 左为真 但 右为假 则结果也为真
System.out.println(a > 100 || b == 2); // 左为假 但 右为真 则结果也为真
System.out.println(a > 100 || b > 100); // 左为假 且 右为假 则结果为假
}
}
4.3、逻辑非!
语法规则:!表达式
表达式也要是布尔表达式!!真变假,假变真
例子1:
所以需要将表达式改为布尔表达式。
例子2:
public class Main{
public static void main(String[] args) {
int a = 1;
System.out.println(!(a==1)); //括号结果为真,取非,最终结果为假
System.out.println(!(a==2)); //括号结果为假,取非,最终结果为真
}
}
4.4、短路求值
短路求值涉及到的运算符:&& ||
//短路求值
//短路与 当表达式1为假时,就不会执行表达式2
System.out.println(10 > 20 && 10 / 0 == 0);//false
//短路或 当表达式1为真时,就不会执行表达式2
System.out.println(10 < 20 || 10 / 0 == 0);//true
例子1:
public class Main{
public static void main(String[] args) {
int a = 10;
int b = 20;
//表达式结果是boolean类型时,表示逻辑运算
System.out.println(a > b);//flase
System.out.println(a < b);//true
System.out.println(a > b && 10/0 == 0);//如果发生短路运算,则只会执行表达式1,结果是false,不会执行表达式2,因此不会报错
System.out.println(a < b || 10/0 == 0);//如果发生短路运算,则只会执行表达式1,结果是true,不会执行表达式2,因此不会报错
}
}
例子2:
public class Main{
public static void main(String[] args) {
int a = 10;
int b = 10;
boolean result = ++a < 5 && ++b < 5;//表达式1 ++a < 5为假,所以不执行表达式2
System.out.println(result);//false
System.out.println(a);//11
System.out.println(b);//10
}
}
5、位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
带有位运算符的操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 位运算就是按照二进制位的每一位依次进行计算。
除了按位取反~
是一元运算符外,其余都是二元运算符。
5.1、按位与&
如果两个二进制位都是 1, 则结果为 1, 否则结果为 0
例子:
public class Main{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a & b);//0
System.out.println(a & a);//10
}
}
5.2、按位或|
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1
例子:
public class Main{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a | b);//30
System.out.println(a | a);//10
}
}
当 &
和 |
的操作数为整数(int, short, long, byte
) 的时候, 表示按位运算, 当操作数为 boolean
的时候, 表示逻辑运算,但是和逻辑运算不同的是不支持短路求值
例子1:
public static void main(String[] args) {
//短路逻辑运算
System.out.println(10 > 20 && 10 / 0 == 0);
System.out.println(10 < 20 || 10 / 0 == 0);
}
【运行结果】
flase
true
例子2:
public static void main(String[] args) {
//按位运算
System.out.println(10 > 20 & 10 / 0 == 0);
System.out.println(10 < 20 | 10 / 0 == 0);
}
【运行结果】
例子3:
public static void main(String[] args) {
int a = 10;
int b = 10;
boolean result = ++a < 5 & ++b < 5;//会左右两边都进行计算
System.out.println(result);
System.out.println(a);
System.out.println(b);
}
【运行结果】
false
11
11
5.3、按位取反~
如果该二进制位为 0 则转为 1, 如果该二进制位为 1 则转为 0
public class Main{
public static void main(String[] args) {
int a = 0xf;
System.out.printf("%x\n",a);//f
System.out.printf("%d\n",a);//15
System.out.printf("%x\n",~a);//fffffff0
System.out.printf("%d\n",~a);//-16
}
}
/*
因为a占4字节,所以内存中补码是00000000 00000000 00000000 00001111
然后按位取反,得11111111 11111111 11111111 11110000
十六进制是ff ff ff f0
转为原码是10000000 00000000 00000000 00010000 => -16
*/
【注意】:
- 如果该位为 0 则转为 1, 如果该位为 1 则转为 0 。
- 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 1 个十六进制数字对应 4个二进制位。
- 0xf 表示十进制的 15, 也就是二进制的1111。
printf
能够格式化输出内容, java 中可以像 C语言那样按照格式输出,%x
表示按照十六进制输出。\n
表示换行符。
5.4、按位异或^
如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。
例子1:
n^n=0 0^n=n
例子2:
int a = 1;
int b = 2;
System.out.println(a ^ b);//3
因为a的二进制是0001,b的二进制是0010,对应二进制位进行比较,得出结果是0011,对应的十进制是3。
6、移位运算符
移位运算符有三种
<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的。
左移<<
最左侧位不要了,最右侧补0
左移一位相当于乘以 2,在右边补 0,左边舍弃
public class Main{
public static void main(String[] args) {
byte a = 65; //0100 0001
System.out.printf("%d\n",a << 1);//10000010 130
System.out.printf("%d\n",a);//65
}
}
注意:左移时,丢弃的是符号位,所以正数的左移可能会变成负数。
右移>>
在左边补符号位(正数补 0,负数补 1),最右侧位不要了
右移一位相当于除以(/) 2,
无符号右移>>>
最右侧位不要了,左边统一补 0
没有<<<
,因为左移统一都是在右边补 0
7、条件运算符(三元运算符)
格式:关系表达式?表达式 2:表达式 3
当 关系表达式
的值为 true
时, 整个表达式的值为 表达式2
的值;
当 关系表达式
的值为 false
时, 整个表达式的值为 表达式3
的值。
也是 java 中唯一的三目运算符。
注意:表达式 2 和表达式 3 的结果需要是同类型的,除非是能发生隐式类型转换。
int a1 = 1;
int b1 = 2;
double c1 = a1 > b1? a1 : 2.0;
//int c2 = a1 > b1? a1 : 2.0;
// error 因为2.0是double,不能隐式转换到int类型
8、运算符的优先级
在Java中涉及了很多的运算符,每一种运算符都有各自的优先级。但是这些优先级不需要记忆。
咱们只要知道其中一点:小括号优先于所有。