运算符:就是对常量或者变量进行操作的符号,比如: + - * /。
表达式:用运算符把常量或者变量连接起来的,符合Java语法的式子,比如:a + b 就是表达式。
1、算数运算符
1.1 介绍
分类:+ - * / %
/:
1.整数相除结果只能得到整除,如果结果想要是小数,必须要有小数参数。
2.小数直接参与运算,得到的结果有可能是不精确的。
%:
取模、取余,做的也是除法运算,只不过获取的是余数而已。
应用场景:①用来判断A是否可以被B整除;②判断A是否为偶数。
练习:数值拆分
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
公式总结:
个位:数字 % 10、十位:数字 / 10 % 10、百位:数字 / 100 % 10,并可以依此类推。
import java.util.Scanner;
public class Arithmeticoperator {
public static void main(String[] args) {
//导包 --- 创建对象 --- 接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int number = sc.nextInt();
//个位: 数字 % 10
int ones = number % 10;
//十位: 数字 / 10 % 10
int tens = number / 10 % 10;
//百位: 数字 / 100 % 10
int hundreds = number / 100 % 10;
System.out.println(hundreds);
System.out.println(tens);
System.out.println(ones);
}
}
1.2 隐式转换和强制转换
1.2.1 隐式转换
概念:也叫自动类型提升。就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要额外写代码单独实现,是程序自动完成的。
取值范围:byte<short<int<long<float<double
提升规则:
- 取值范围小的和取值范围大的进行运算,小的会先提升为大的,再进行运算。
- byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算。
练习一:
int i = 10;
long n = 100L;
double d = 20.0;
result = i + n + d;
问变量result是什么类型的?
答案:double类型
练习二:
byte b = 10;
short s = 20;
long n = 100L;
result = b + s + n;
问变量result是什么类型的?
答案:long类型
变量b和变量s里面的值会先提升为int参与运算,而long类型的取值范围是大于int的取值范围的。
1.2.2 强制转换
概念:如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量,是不允许直接操作的,如果一定要这么干,就需要加入强制转换。
格式:目标数据类型 变量名 = (目标数据类型)被强转的数据;
public class OperatorDemo {
public static void main(String[] args) {
byte b1 = 10;
byte b2 = 20;
byte result = (byte)(b1 + b2);
System.out.println(result);
}
}
注:强制转换有可能会导致数据发生错误。(数据的精度丢失)
1.3 加操作
1.3.1 字符串“+”操作
核心技巧:
- 当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
- 当连续进行+操作时,从左到右逐个执行的。
练习:
System.out.println(3.7 + "abc"); //结果:"3.7abc"
System.out.println("abc" + true); //结果:"abctrue"
System.out.println('中' + "abc" + true); //结果:"中abctrue"
int age = 18;
System.out.println("我的年龄是" + age + "岁"); //"我的年龄是18岁"
System.out.println(1 + 2 + "abc" + 2 + 1); //"3abc21"
注:字符串只有+操作,没有其他操作。
1.3.2 字符的“+”操作
规则:当+操作中出现了字符,会拿着字符到计算机内置的ASCII码表中去查对应的数字,然后再进行计算。
System.out.println(1 + 'a'); //98
System.out.println('a' + "abc"); //"aabc"
1.4 自增自减运算符
分类:++ 自增运算符;-- 自减运算符
int a = 10;
a++;
System.out.println(a);//11
单独使用时:不管是先++,还是后++。单独写在一行的时候,运算结果是一模一样的。
练习:
int x = 10;
int y = x++; //先用后加
int z = ++x; //先加后用
System.out.println("x:" + x); //12
System.out.println("y:" + y); //10
System.out.println("z:" + z); //12
2、赋值运算符
运算过程:就是把等号右边的结果赋值给左边的变量
分类: =、+=、-=、*=、/=、%=
运算规则:把左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响。
short s = 1;
s += 1;
//等同于:s = (short)(s + 1);
System.out.println(s);//2
注:扩展的赋值运算符中隐层还包含了一个强制转换。
3、关系运算符
又叫比较运算符,就是拿着左边跟右边进行判断。
符号 | 解释 |
== | 判断左边跟右边是否相等 |
!= | 判断左边跟右边是否不相等 |
> | 判断左边是否大于右边 |
>= | 判断左边是否大于等于右边 |
< | 判断左边是否小于右边 |
<= | 判断左边是否小于等于右边 |
注:关系运算符最终的结果一定是布尔类型的。要么是true,要么是false。
练习:相亲
需求描述:键盘录入两个整数,表示你和你约会对象的衣服时髦度(手动录入0~10之间的整数)。如果你的时髦度大于你对象的时髦度,相亲就成功输出true,否则输出false。
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入自己的衣服时髦度:");
int boy = sc.nextInt();
System.out.println("请输入相亲对象的衣服时髦度:");
int girl = sc.nextInt();
boolean result = boy > girl;
System.out.println(result);
}
}
4、逻辑运算符
4.1 分类
符号 | 作用 | 说明 |
& | 逻辑与(且) | 并且,两边都为真,结果才为真 |
| | 逻辑或 | 或者,两边都为假,结果才为假 |
! | 逻辑非 | 取反 |
^ | 逻辑异或 | 相同为false,不同为true |
4.2 短路逻辑运算符
分类: &&、||运算结果跟&、|是一模一样的,只不过具有短路效果。
逻辑核心:当左边不能确定整个表达式的结果,右边才会执行。当左边能确定整个表达式的结果,那么右边就不会执行了,从而提高了代码的运行效率。
示例:
public class Test {
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); //11
System.out.println(b); //10
}
}
练习:
需求描述:键盘录入两个整数,如果其中一个为6,最终结果为true;如果他们的和为6的倍数,结果输出true;其他情况输出false。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//1.键盘录入两个整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int number1 = sc.nextInt();
System.out.println("请输入第二个整数:");
int number2 = sc.nextInt();
//2.逻辑运算
boolean result = number1 == 6 || number2 == 6 || (number1 + number2) % 6 ==0;
System.out.println(result);
}
}
5、三元运算符
格式:关系表达式 ? 表达式1 :表达式2 ;
计算规则:计算关系表达式的值,如果关系表达式的值为真,那么执行表达式1;如果关系表达式的值为假,那么执行表达式2。
注:三元运算符的最终结果一定要被使用,要么赋值给一个变量,要么直接打印出来。
示例:获取两个数的较大值
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
//格式:关系表达式 ? 表达式1 : 表达式2 ;
int max = a > b ? a : b ;
System.out.println(max);
}
}
练习:两只老虎
需求:动物园里有两只老虎,两只老虎的体重分别为通过键盘录入获得,请用程序实现判断两只老虎的体重是否相同。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//1.录入体重
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一只老虎的体重:");
int weight1 = sc.nextInt();
System.out.println("请输入第二只老虎的体重:");
int weight2 = sc.nextInt();
//2.比较
String result = weight1 == weight2 ? "相同" : "不相同";
System.out.println(result);
}
}
6、运算符优先级
小括号优先于所有。
优先级 | 运算符 |
1 | . () {} |
2 | !、-、++、-- |
3 | *、/、% |
4 | +、- |
5 | <<、>>、>>> |
6 | <、<=、>、>=、instanceof |
7 | ==、!= |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | =、+=、-=、*=、/=、%=、&= |
7、原码、反码、补码
(1)原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。
最大值:01111111 +127;最小值:11111111 -127
利用原码对正数进行计算是不会有问题的。但是如果是负数计算,结果会出错。
(2)反码:为了解决原码不能计算负数的问题而出现的。
计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。
弊端:负数运算的时候,如果结果不跨0,则没有问题;如果结果跨0,跟实际结果会有1的偏差。
(3)补码:为了解决负数计算时跨0的问题而出现的。
正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(即在反码的基础上+1)。另外,补码还能多记录一个特殊的值-128,该数据在1个字节下,没有原码和反码。
注:计算机中的存储和计算都是以补码的形式进行的。