作用
- 表达式:用运算符连接起来的式子
- 运算符的分类:按照功能分:算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符…

2.10.1 算术运算符
| 算术运算符 | 符号解释 |
|---|---|
+ |
加法运算,字符串连接运算,正号 |
- |
减法运算,负号 |
* |
乘法运算 |
/ |
除法运算,整数/整数结果还是整数 |
% |
求余运算,余数的符号只看被除数 |
++、-- |
自增自减运算 |
加减乘除模
public class OperatorDemo01 {public static void main(String[] args) {int a = 3;int b = 4;System.out.println(a + b);// 7System.out.println(a - b);// -1System.out.println(a * b);// 12System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢?System.out.println(a % b);// 3System.out.println(5%2);//1System.out.println(5%-2);//1System.out.println(-5%2);//-1System.out.println(-5%-2);//-1//商*除数 + 余数 = 被除数//5%-2 ==>商是-2,余数时1 (-2)*(-2)+1 = 5//-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5}}
“+”号的两种用法
- 第一种:对于
+两边都是数值的话,+就是加法的意思 第二种:对于
+两边至少有一边是字符串得话,+就是拼接的意思public class OperatorDemo02 { public static void main(String[] args) { // 字符串类型的变量基本使用 // 数据类型 变量名称 = 数据值; String str1 = "Hello"; System.out.println(str1); // Hello System.out.println("Hello" + "World"); // HelloWorld String str2 = "Java"; // String + int --> String System.out.println(str2 + 520); // Java520 // String + int + int // String + int // String System.out.println(str2 + 5 + 20); // Java520 // 先加后拼接 System.out.println(5 + 20 + str2); // 25Java } }
自加自减运算
理解:++ 运算,变量自己的值加1。反之,-- 运算,变量自己的值减少1,用法与++ 一致。
单独使用
- 变量在单独运算的时候,变量前
++和变量++,变量的是一样的 - 变量前
++:例如++a - 变量后
++:例如a++public class OperatorDemo3 { public static void main(String[] args) { // 定义一个int类型的变量a int a = 3; //++a; a++; // 无论是变量前++还是变量后++,结果都是4 System.out.println(a); } }
复合使用
- 和
其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就不同了 - 变量前
++:变量先自身加1,然后再取值 - 变量后
++:变量先取值,然后再自身加1
public class OperatorDemo03 {
public static void main(String[] args) {
// 其他变量放在一起使用
int x = 3;
//int y = ++x; // y的值是4,x的值是4,
int y = x++; // y的值是3,x的值是4
System.out.println(x);
System.out.println(y);
System.out.println("==========");
// 和输出语句一起
int z = 5;
//System.out.println(++z);// 输出结果是6,z的值也是6
System.out.println(z++);// 输出结果是5,z的值是6
System.out.println(z);
int a = 1;
a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1
int i = 1;
int j = i++ + ++i * i++;
/*
从左往右加载
(1)先算i++
①取i的值“1”放操作数栈
②i再自增 i=2
(2)再算++i
①i先自增 i=3
②再取i的值“3”放操作数栈
(3)再算i++
①取i的值“3”放操作数栈
②i再自增 i=4
(4)先算乘法
用操作数栈中3 * 3 = 9,并把9压会操作数栈
(5)再算求和
用操作数栈中的 1 + 9 = 10
(6)最后算赋值
j = 10
*/
}
}
小结
- ++在前,先自加,后使用;
-
练习
获取一个四位数的个位,十位,百位,千位
public class Test01 { public static void main (String [] args) { //1.定义一个四位数,例如1234 int num = 1234; //2.通过运算操作求出个位,十位,百位,千位 int ge = 1234 % 10; int shi = 1234 / 10 % 10; int bai = 1234 / 100 % 10; int qian = 1234 / 1000 % 10; System.out.println(num + "这个四位数个位上的数字是:" + ge); System.out.println(num + "这个四位数十位上的数字是:" + shi); System.out.println(num + "这个四位数百位上的数字是:" + bai); System.out.println(num + "这个四位数千位上的数字是:" + qian); } }
自增自减练习
判断如下代码的运行结果
public static void main(String[] args){
int i = 1;
int j = i++;
int k = i++ * ++j + ++i * j++;
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
}
public static void main(String[] args){
int i = 1;
int j = i++;
int k = i++ * ++j + --i * j--;
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
}
public static void main(String[] args){
int i = 1;
int j = ++i + i++ * ++i + i++;
System.out.println("i = " + i);
System.out.println("j = " + j);
}
public static void main(String[] args){
int i = 0;
int result = ++i/--i;
System.out.println("result="+result);
}
2.10.2 赋值运算符
注意:所有的赋值运算符的 = 左边一定是一个变量
| 赋值运算符 | 符号解释 |
|---|---|
= |
将符号右边的值,赋值给左边的变量 |
+= |
将符号**左边的值**和**右边的值**进行相加操作,最后将结果 **赋值给左边的变量** |
-= |
将符号**左边的值**和**右边的值**进行相减操作,最后将结果 **赋值给左边的变量** |
*= |
将符号**左边的值**和**右边的值**进行相乘操作,最后将结果 **赋值给左边的变量** |
/= |
将符号**左边的值**和**右边的值**进行相除操作,最后将结果 **赋值给左边的变量** |
%= |
将符号**左边的值**和**右边的值**进行取余操作,最后将结果 **赋值给左边的变量** |
基本赋值运算符课堂案例
public class OperatorDemo04 {
public static void main(String[] args) {
int a = 3;
int b = 4;
a = a + b;
System.out.println(a); // 7
System.out.println(b); // 4
}
}
扩展赋值运算符课堂案例
public class OperatorDemo04 {
public static void main(String[] args) {
int a = 3;
int b = 4;
b += a;// 相当于 b = b + a ;
System.out.println(a); // 3
System.out.println(b); // 7
short s = 3;
// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
s += 4; // 代码没有报错
//因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
System.out.println(s);
int j = 1;
j += ++j * j++;//相当于 j = j + (++j * j++);
System.out.println(j);//5
}
}
扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换
练习
交换两个变量的值
int m = 1;
int n = 2;
int m = 1;
int n = 2;
int temp = m;
m = n;
n = temp;
2.10.3 关系运算符/比较运算符
| 关系运算符 | 符号解释 |
|---|---|
< |
比较符号左边的数据是否小于右边的数据,如果小于结果是true |
> |
比较符号左边的数据是否大于右边的数据,如果大于结果是true |
<= |
比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false |
>= |
比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false |
== |
比较符号两边数据是否相等,相等结果是true |
!= |
不等于符号 ,如果符号两边的数据不相等,结果是true |
- 比较运算符,是两个数据之间进行比较的运算,运算结果一定是 boolean 值
true或者false 其中 >,<,>=,<= 不支持 boolean,String 类型,== 和 != 支持boolean 和 String
public class OperatorDemo05 { public static void main(String[] args) { int a = 3; int b = 4; 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 } }
练习:判断如下程序的运行结果
public static void main(String[] args){
int a = 1;
int b = 2;
int c = 0;
boolean flag = false;
if(flag=true){
c = a++ + b;
}
if(flag=false){
c = ++a - b;
}
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
2.10.4 逻辑运算符
逻辑运算符,是用来连接两个布尔类型结果的运算符(!除外),运算结果一定是boolean值true或者false
| 逻辑运算符 | 符号解释 | 符号特点 |
|---|---|---|
& |
与,且 | 有false则false |
| |
或 | 有true则true |
^ |
异或 | 相同为false,不同为true |
! |
非 | 非false则true非 true则false |
&& |
双与,短路与 | 左边为false,则右边就不看 |
|| |
双或,短路或 | 左边为true,则右边就不看 |
课堂案例
public class OperatorDemo06 {
public static void main(String[] args) {
int a = 3;
int b = 4;
int c = 5;
// & 与,且;有false则false
System.out.println((a > b) & (a > c));
System.out.println((a > b) & (a < c));
System.out.println((a < b) & (a > c));
System.out.println((a < b) & (a < c));
System.out.println("===============");
// | 或;有true则true
System.out.println((a > b) | (a > c));
System.out.println((a > b) | (a < c));
System.out.println((a < b) | (a > c));
System.out.println((a < b) | (a < c));
System.out.println("===============");
// ^ 异或;相同为false,不同为true
System.out.println((a > b) ^ (a > c));
System.out.println((a > b) ^ (a < c));
System.out.println((a < b) ^ (a > c));
System.out.println((a < b) ^ (a < c));
System.out.println("===============");
// ! 非;非false则true,非true则false
System.out.println(!false);
System.out.println(!true);
}
}
&&和&区别,||和|区别
**&&**和**&**区别:&&和&结果一样,&&有短路效果,左边为 false,右边不执行;&左边无论是什么,右边都会执行
**||**和**|**区别:||和|结果一样,||有短路效果,左边为 true,右边不执行;|左边无论是什么,右边都会执行
面试题1:输出结果是什么
public class LogicExer1{
public static void main(String[] args){
int x = 1;
int y = 1;
//x==2 ,x++ false x = 2 左边为false
//右边继续
//++y y==2 y=2 y==2成立 右边为true
//false & true 结果false
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//x=2,y=2
}
}
public class LogicExer2{
public static void main(String[] args){
int x = 1,y = 1;
//x==2,x++ 左边条件为false,x=2
//因为短路与,右边不算
//false && ? 结果是false
if(x++==2 && ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//x=2,y=1
}
}
public class LogicExer3{
public static void main(String[] args){
int x = 1,y = 1;
//x==1,x++ 左边为true,x=2
//因为是逻辑与,右边继续
//++y, y==1 y=2 右边为false
//条件true | false,最终为true
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//x=7,y=2
}
}
public class LogicExer4{
public static void main(String[] args){
int x = 1,y = 1;
//x==1,x++ 左边为true,x=2
//因为是短路或,左边为true,右边就不看了
//整个条件为true
if(x++==1 || ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//x=7,y=1
}
}
4、面试题2:输出结果是什么
public class LogicExer5{
public static void main (String [] args) {
boolean x = true;
boolean y = false;
short z = 42;
//如果if((z++==42)&&(y==true))条件成立,执行z++,不成立,就不执行z++
//左边的条件:z==42,z++ z==42成立,z++变成43
//中间虽然是短路与,因为左边现在是true,右边还要看
//右边 y==true 不成立
//true && false 结果为false
if((z++==42)&&(y==true)) z++;
//左边为x=false,赋值 结果就为false
//中间虽然为短路或,因为左边是false,右边继续看
//++z,z==45 ++z变成44,z==45是否成立,不成立
//false || false 结果为false
if((x=false) || (++z==45)) z++;
System. out.println("z="+z);//44
}
}
class Test4_2 {
public static void main (String [] args) {
boolean x = true;
boolean y = false;
short z = 42;
//如果if(y=true)条件成立,接着判断if((z++==42)&&(y==true)) z++;
//如果不成立,if((z++==42)&&(y==true)) z++; 不看的
/*
if(y = true)
if((z++==42)&&(y==true)) z++;
if((x=false) || (++z==45)) z++;
*/
//标准
//y=true赋值,y就被修改为true,if(true)成立
if(y=true){
//左边:z==42,z++ 成立,z变成43
//&&短路与,不满足短路的情况,右边继续
//y==true 成立
//true && true,结果为true
if((z++==42)&&(y==true)){
//z++变成44
z++;
}
}
//左边:x=false不成立
//中间虽然是短路或,但是没满足短路的情况,右边继续
//++z,z==45 ++z变成45,z==45成立
if((x=false) || (++z==45)){
//z++,变成46
z++;
}
System. out.println("z="+z);//46
}
}
2.10.5 条件运算符(三目运算符/三元运算符)
格式
条件表达式?结果1:结果2
条件运算符计算方式:
- 条件判断的结果是 true,条件运算符整体结果为结果 1,赋值给变量
- 判断条件的结果是 false,条件运算符整体结果为结果 2,赋值给变量
public static void main(String[] args) { int i = (1==2 ? 100 : 200); System.out.println(i);//200 int j = (3<=4 ? 500 : 600); System.out.println(j);//500 }
练习
1、声明三个整型的变量,a,b,c,要求找出最大值
2、声明一个整型的变量,判断它是正数还是负数,还是0
2.10.6运算符优先级

提示说明:
- 表达式不要太复杂
- 先算的使用()
大体的排序:算术->位—>比较—>逻辑—>三元—>赋值
