java第三讲(运算符)
文章目录
Java 运算符
一、运算符基础
定义:对操作数进行操作的符号,不同运算符操作含义不同。
Java 运算符分类:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符。
二、算术运算符
分为基本四则运算符、增量运算符、自增/自减运算符,是数值运算的核心。
1. 基本四则运算符:+ - * / %(加减乘除模)
特点:二元运算符,必须有左右两个操作数。
代码案例:
int a =20;int b =10;System.out.println(a + b);// 30System.out.println(a - b);// 10System.out.println(a * b);// 200System.out.println(a / b);// 2System.out.println(a % b);// 0 (模运算=除法余数)核心注意事项:
操作数类型不一致时,向范围大的类型自动提升:
System.out.println(1+0.2);// 1.2(int自动提升为double)% 可对 double 取模(无实际意义,一般仅用于整型),运算结果符合取决于第一个数:
System.out.println(11.5%2.0);// 1.5System.out.println(10%3);//1System.out.println(-10%3);//-1除法和取模的右操作数不能为0,否则抛出算术异常:
int a =1;int b =0;System.out.println(a / b);// 报错:ArithmeticException(算术异常): / by zeroint / int 结果仍为 int,向下取整(舍弃小数点后所有数):
int a =3;int b =2;System.out.println(a / b);// 1(非1.5)// 想得到数学精确结果,需将其中一个数转为浮点型double d = a *1.0/ b;System.out.println(d);// 1.52. 增量运算符:+= -= *= /= %=
特点:运算结果自动赋值给左操作数,仅支持变量,不支持常量;可帮你进行类型转换。
代码案例:
int a =1; a +=2;// 等价于 a = a + 2 → a=3System.out.println(a); a -=1;// 等价于 a = a - 1 → a=2System.out.println(a); a *=3;// 等价于 a = a * 3 → a=6System.out.println(a); a /=3;// 等价于 a = a / 3 → a=2System.out.println(a); a %=3;// 等价于 a = a % 3 → a=2System.out.println(a);int c =10;long d =20; c += d;System.out.println(c);//303. 自增/自减运算符:++ - -
作用:++ 给变量+1,-- 给变量-1;仅支持变量,不支持常量。
核心区别:单独使用无区别,混合使用有先后顺序
代码案例:
int a =1; a++;// 后置++,单独使用 → a=2++a;// 前置++,单独使用 → a=3// 混合使用:后置++ 先使用原值,表达式结束后+1System.out.println(a++);// 输出3,执行后a=4// 混合使用:前置++ 先+1,再使用新值System.out.println(++a);// 先a=5,再输出5// 自减-- 规则与自增++完全一致 a--;System.out.println(a--);// 输出4,执行后a=3--a;System.out.println(--a);// 先a=1,再输出1三、关系运算符
常用符号:== != < > <= >=(共6个)
核心特点:运算结果为布尔值(true/false);= 是赋值,== 才是判断相等。
代码案例:
int a =10;int b =20;System.out.println(a == b);// falseSystem.out.println(a != b);// trueSystem.out.println(a < b);// trueSystem.out.println(a > b);// falseSystem.out.println(a <= b);// trueSystem.out.println(a >= b);// false关键注意:不能连续写多个关系运算符(与数学不同),如 3 < a < 5 是错误写法。
四、逻辑运算符(重点)
常用符号:&& || !(逻辑与、逻辑或、逻辑非)
核心特点:操作数为布尔值,运算结果也为布尔值;&& 和 || 支持短路求值。
1. 逻辑与 &&:一假则假,全真才真
规则:左右表达式都为true,结果才为true;任意一个为false,结果为false。
代码案例:
int a =1;int b =2;System.out.println(a ==1&& b ==2);// true(全真)System.out.println(a ==1&& b >100);// false(右假)System.out.println(a >100&& b ==2);// false(左假)System.out.println(a >100&& b >100);// false(全假)2. 逻辑或 ||:一真则真,全假才假
规则:左右表达式任意一个为true,结果为true;都为false时,结果为false。
代码案例:
int a =1;int b =2;System.out.println(a ==1|| b ==2);// true(全真)System.out.println(a ==1|| b >100);// true(左真)System.out.println(a >100|| b ==2);// true(右真)System.out.println(a >100|| b >100);// false(全假)3. 逻辑非 !:真变假,假变真
规则:一元运算符,仅对一个布尔表达式取反。
代码案例:
int a =1;System.out.println(!(a ==1));// false(原true取反)System.out.println(!(a !=1));// true(原false取反)4. 短路求值(核心特性)
规则:&& 左侧为false时,直接返回false,不计算右侧表达式;|| 左侧为true时,直接返回true,不计算右侧表达式。
代码案例(无异常,因右侧未执行):
// 10/0会抛异常,但此处因短路求值未执行System.out.println(10>20&&10/0==0);// falseSystem.out.println(10<20||10/0==0);// true对比:& 和 | 作逻辑运算时不支持短路求值,会执行所有表达式,直接抛异常:
System.out.println(10>20&10/0==0);// 报错System.out.println(10<20|10/0==0);// 报错五、位运算符
Java 中数据操作最小单位是比特位(0/1),位运算符按二进制位逐位运算;
常用符号:& | ~ ^(按位与、按位或、按位取反、按位异或);除 ~ 是一元运算符,其余为二元。
注意:操作数为整数时是位运算,为布尔值时是逻辑运算(与&& ||区分)。
1. 按位与 &:两位都为1,结果为1,否则为0
代码案例:
int a =10;// 二进制:00001010int b =20;// 二进制:00010100System.out.println(a & b);// 0(二进制:00000000)System.out.println(10< 20 & 10 >0);//都为真,true System.out.println(10>20&10>0);//第一个为假,falseSystem.out.println(10<20&10<0);//第二个为假。falseSystem.out.println(10>20&10<0);//都为假,false2. 按位或 |:两位都为0,结果为0,否则为1
代码案例:
int a =10;// 二进制:00001010int b =20;// 二进制:00010100System.out.println(a | b);// 30(二进制:00011110)3. 按位取反 ~:0变1,1变0
代码案例(十六进制简化二进制,%x 按十六进制输出):
int a =0xf;// 0xf=15,二进制:00001111System.out.printf("%x\n",~a);// 按位取反后结果:ffffff04. 按位异或 ^:两位相同为0,不同为1
核心特性:两个相同数异或结果为0;
代码案例:
int a =0x1;// 二进制:0001int b =0x2;// 二进制:0010System.out.printf("%x\n", a ^ b);// 3(二进制:0011)System.out.println(5^5);// 0(相同数异或为0)System.out.println(5^0);// 5(0异或任何数为当前那个数)六、移位运算符(了解)
按二进制比特位移动,都是二元运算符;符号:<< >> >>>(左移、右移、无符号右移)。
1. 左移 <<:最左侧位舍弃,最右侧补0
规则:左移N位 ≈ 原数 × 2的N次方(计算效率高于乘除);
代码案例(0x10 是十六进制,对应十进制16):
int a =0x10;System.out.printf("%x\n", a <<1);// 20(左移1位,16×2=32=0x20)注意:左移会舍弃符号位,正数左移可能变成负数。
2. 右移 >>:最右侧位舍弃,最左侧补符号位(正数(符号位为0)补0,负数(符号位为1)补1)
规则:右移N位 ≈ 原数 ÷ 2的N次方;
代码案例:
int a =0x10;System.out.printf("%x\n", a >>1);// 8(16÷2=8=0x8)int b =0xffff0000;// 负数System.out.printf("%x\n", b >>1);// ffff8000(左侧补1)int c =-1;System.out.println(c >>2);//-13. 无符号右移 >>>:最右侧位舍弃,最左侧统一补0(无论正负)
代码案例:
int a =0xffffffff;// 负数System.out.printf("%x\n", a >>>1);// 7fffffff(左侧补0)移位通用注意:
- 移位效率远高于乘除,乘除2的N次方时优先用移位;
- 移动负数位、移位位数过大,均无实际意义。
七、条件运算符
唯一符号:表达式1 ? 表达式2 : 表达式3(Java 唯一三目运算符);
作用:简化条件判断,是 if-else 的简写形式。
执行规则:
- 表达式1为true → 整个表达式结果=表达式2的值;
- 表达式1为false → 整个表达式结果=表达式3的值。
代码案例
// 求两个整数的最大值int a =10;int b =20;int max = a > b ? a : b;System.out.println(max);// 20//强化boolean flg =true==true?true==false?false:true:false;System.out.println(flg);//true核心注意事项
条件表达式不能单独存在,运算结果必须被使用(赋值/输出等):
int a =10;int b =20; a > b ? a : b;// 报错:不是有效语句表达式2和表达式3的结果类型必须一致(除非支持隐式类型转换):
int a =10;int b =20;int c = a > b ?1:2.0;// 错误:类型不匹配(int和double)八、运算符的优先级
- 不同运算符优先级不同(如
* /高于+ -,+ -高于移位运算符); - 无需记忆优先级规则,加括号即可消除表达式歧义,提升代码可读性。
代码案例
// 求a和b的平均值,错误写法(+优先级高于>>)int a =10;int b =20;int c = a +(b - a)>>1;// 等价于 (10+10)>>1 → 20>>1=10System.out.println(c);// 10// 正确写法:加括号明确运算顺序int d = a +((b - a)>>1);System.out.println(d);// 15