ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第4章 运算符与表达式

第4章 运算符与表达式 第4章 运算符与表达式数据定义好之后就要对数据进行运算。本节系统学习 Java 的各类运算符算术、赋值、比较、逻辑、三元等。一、算术运算符运算符说明示例结果加7 310-减7 - 34*乘7 * 321/除7 / 32整数相除取整%取余7 % 31System.out.println(7/3);// 2整数除法直接丢弃小数System.out.println(7.0/3);// 2.3333333333333335有小数参与就是浮点除法System.out.println(7%3);// 17 3*2 1为什么7 / 3是 2因为 int 类型装不下小数Java 规定整数 ÷ 整数结果仍是整数小数部分直接丢弃不是四舍五入3.99 也会变成 3。要保留小数至少让一边变成浮点数。另外整数除以 0 会抛ArithmeticException浮点除以 0 得Infinity注意分母别为 0。// 取余 % 的经典应用判断奇偶、拆数字System.out.println(123%2);// 1奇数System.out.println(123%10);// 3个位数字System.out.println(123/10%10);// 2十位数字自增自减运算符inta10;a;// a 11自增a--;// a 10自减intb10;intcb;// c 10先取值再自增后缀b 变成 11intdb;// d 12先自增再取值前缀b 变成 12口诀前缀 先用后加后缀 先加后用站在使用者的角度看。为什么要有因为i i 1在循环里写得太啰嗦i一行搞定。单独成行时前缀和后缀结果完全一样只有混进表达式里才有区别见扩展知识与易错点。二、赋值运算符是赋值不是数学中的等号intx5;x3;// x x 3 8x-2;// x 8 - 2 6x*4;// x 24x/6;// x 4x%3;// x 1复合赋值运算符、-、*、/、%能让代码更简洁且自带隐式强转// 复合赋值自带隐式强转byte 也能直接做运算byteb10;b5;// 编译通过等价于 b (byte)(b 5)// b b 5; // 编译报错b 5 是 int不能直接赋给 byte三、比较运算符结果永远是布尔值true/false运算符说明示例结果相等5 5true!不等5 ! 5false大于5 3true小于5 3false大于等于5 5true小于等于3 5true// 比较结果可以直接存进 boolean后面给 if 用booleanflag53;// trueSystem.out.println(flag);System.out.println(A65);// trueA 的 Unicode 编号就是 65注意基本类型用比较值String 等引用类型用比较的是地址比较内容要用equals()方法后面字符串章节会重点讲。四、逻辑运算符用于连接多个布尔表达式运算符说明示例短路与两边都为 true 才为 truea 0 b 0||短路或一边为 true 即为 truea 0 || b 0!非取反!true→ falseintage20;booleanisAdultage18;// truebooleancanDriveisAdultage70;// true满足两个条件booleanisKid!isAdult;// false短路特性重要左边为 false 时右边不再执行||左边为 true 时右边不再执行intx10;booleanr(x100)(x0);// 右边不执行x 仍是 10这个特性常用于避免空指针name ! null name.length() 0就是最经典的写法具体实战放到扩展知识里演示。五、三元运算符格式条件 ? 值1 : 值2intscore85;Stringresultscore60?及格:不及格;System.out.println(result);// 及格它是 if-else 的简写但表达式必须有返回值。可以嵌套但超过两层可读性很差不建议。求最大值这类二选一取值用三元最顺手int max a b ? a : b;六、运算符优先级从高到低常用顺序括号()自增自减 --乘除余* / %加减 -比较 相等 !逻辑与逻辑或||赋值 - ...建议不确定优先级时就用括号代码可读性比省几个括号重要得多。intresult(12)*(34)-5/2;// 3 * 7 - 2 19七、字符串拼接遇到字符串时是拼接操作Stringname张三;intage25;System.out.println(姓名name年龄age);// 姓名张三年龄25任何类型与字符串相加都会先转成字符串再拼接。后面字符串章节会讲为什么循环中拼接字符串性能差StringBuilder 的由来。// 任何类型遇到 字符串 都先转成字符串拼接方向从左往右System.out.println(结果是(12));// 结果是3括号里先算加法System.out.println(结果是12);// 结果是12直接拼接八、扩展知识1. 位运算入门 | ^ 面试常考、底层代码常用。注意区分、||是逻辑运算结果只有 true/false、|是位运算直接操作二进制位。运算符名称规则示例按位与两位都是 1 结果才是 16 3 2|按位或有一位是 1 结果就是 16 | 3 7^按位异或两位不同为 1相同为 06 ^ 3 5左移整体左移低位补 06 1 12右移整体右移高位补符号位6 1 3// 移位左移一位 乘 2右移一位 整除 2System.out.println(61);// 12System.out.println(61);// 3// 应用 1 判断奇偶n (n-1) 0 判断 2 的幂System.out.println((71)0?偶数:奇数);// 奇数System.out.println(160(1615)0);// true16 2^42. 短路求值的判空应用短路特性在判空 用值组合里几乎是标配写法// 配合三元做兜底显示配置或输入可能是 nullStringsgetInput();// 假设这个方法可能返回 nullStringshow(s!null!s.isEmpty())?s:空;System.out.println(show);// 空null 被安全兜底3. 自增自减的底层原理一句话概括i是先把 i 的当前值作为表达式结果再自增i是先自增再把新值作为表达式结果。// 后缀拿到的是自增前的值前缀拿到的是自增后的新值inta5;intbaa;// 第一次取 5a 变 6第二次取 6a 变 7 → 5 6 11intx5;intyxx;// 先变 6再变 7 → 6 7 13System.out.println(b y);// 11 13这种先后顺序在 JVM 底层对应专门的字节码指令。记住结论即可别把自增写进复杂表达式单独一行用谁都看得懂。九、易错点1. 整数除法直接取整// ❌ 想要 2.5却得到 2.05/2 先按 int 算出 2doubled15/2;System.out.println(d1);// 2.0// ✅ 至少一边是浮点数或显式强转doubled25/2.0;// 2.5doubled3(double)5/2;// 2.52. % 取余对负数的符号// ❌ 以为 -5 % 2 是 1实际是 -1符号跟随被除数System.out.println(-5%2);// -1System.out.println(5%-2);// 1// ✅ 需要非负余数时先对绝对值取余intrMath.abs(-5)%2;// 13. 用 比较浮点数// ❌ 0.1 0.2 实际是 0.30000000000000004和 0.3 永不相等doublea0.10.2;if(a0.3){// false里面永远不会执行System.out.println(相等);}// ✅ 用差值的绝对值小于一个极小值判断近似相等if(Math.abs(a-0.3)0.000001){System.out.println(近似相等);// 走这里}4. 记不住优先级却不用括号// ❌ 依赖记忆硬写隔几天自己都看不懂intr12*31;// (1 6) 1 3// ✅ 用括号把意图写清楚可读性优先intr2(12*3)1;// 3一眼看懂5. a 与 a 混用// ❌ 前缀后缀混进一个表达式结果全靠猜inti1;intjii;// 1 3 4i 变成 3// ✅ 自增自减单独成行前缀后缀完全等价行为清晰i1;i;i;System.out.println(i);// 3十、小结本系列统一按 JDK 8、JDK 11、JDK 17 三个 LTS 版本讲解。运算符这部分三个版本写法完全一致你用哪个版本练习都一样不用担心差异。整数除法取整、取余%用途广泛判断奇偶、取某位数字比较基本类型的值引用类型比较内容用equals、||有短路特性判空场景很好用三元是简单分支的语法糖嵌套别超过两层优先级记不住就用括号位运算是加分项业务代码别滥用自增自减单独成行使用下一节学习条件控制语句 if / switch。下一篇第5章 条件控制if / switch
返回列表