
大二上学期 Java 第三课运算符与键盘输入——从算得对到读得进第二课解决了数据怎么存第三课解决两件事存进去的数据怎么运算以及怎么让程序从键盘读数据进来。这一课看似简单但输入类的那个经典 bug 能卡住一半人运算符的坑也全在细节里。一、运算符的分类先建立地图Java 的运算符按功能分五类算术、赋值、比较、逻辑、位运算位运算大二上学期一般只要求认识不深究。这一课的重点是前三类加上自增自减逻辑运算符要理解短路特性。二、算术运算符整数除法和取模是重灾区加减乘和数学里一样真正要盯住的是除法、取模和自增自减。2.1 整数除法会丢小数两个整数相除结果仍然是整数小数部分直接舍弃不是四舍五入。想得到小数结果必须让参与运算的至少一方是浮点类型。这个规则在第二课的类型提升基础上理解整数运算结果还是整数不会自动变成小数。经典陷阱求平均分时如果总分和人数都是整数直接相除会丢掉小数。正确做法是把其中一个转成浮点或者乘以 1.0 再除。2.2 取模的符号问题取模求余数的结果符号跟被除数一致和除数无关。这一点和数学里的余数直觉不同负数的取模结果经常让人算错。做循环取余、判断奇偶时问题不大但一旦涉及负数就要格外小心。2.3 自增自减前缀和后缀的区别自增自减分前缀和后缀两种写法。单独成句时两者完全等价都是让变量加一或减一。一旦参与表达式区别就出来了· 前缀形式先自增再把新值参与运算· 后缀形式先把旧值参与运算再自增。课堂最爱的考题就是把自增藏在表达式里让你算最终结果。大二阶段的建议是实际写代码时永远不要让自增自减混在复杂表达式里单独成行写可读性最高也不会算错。考试归考试工程归工程。三、赋值运算符复合赋值的隐式转换复合赋值运算符加等、减等、乘等、除等、模等本质是运算加赋值的缩写。但有一个隐藏细节复合赋值自带隐式强制类型转换。也就是说两个 byte 相加再赋回 byte用普通写法会因为自动提升为 int 而报错但用复合赋值写法就能编译通过因为编译器在赋值那一步自动帮你转了。这个特性知道即可不建议依赖它因为它悄悄吞掉了类型转换容易埋下溢出隐患。四、比较运算符结果一定是布尔值大于、小于、等于、不等于、大于等于、小于等于这六种比较的结果永远是布尔值要么真要么假。这里有两个和第二课呼应的点第一判断两个值是否相等用双等号单等号是赋值。初学者把条件里的双等号写成单等号是编译错误里最常见的一类好在 Java 会直接报错不像 C 那样悄悄赋值然后逻辑全错。第二浮点数不要直接用双等号比较相等。因为小数在二进制里往往不能精确表示两个理论上相等的浮点数实际存储可能有极小误差。判断浮点数相等要用差的绝对值小于某个极小值的方式。这个问题在做实验课的计算题时一定会碰到。五、逻辑运算符短路特性是重点逻辑与、逻辑或、逻辑非是三个基本逻辑运算符。大二上学期最该掌握的是短路特性· 逻辑与左边为假时右边不再执行直接判定整个表达式为假· 逻辑或左边为真时右边不再执行直接判定整个表达式为真。为什么重要 因为短路能保护代码。比如数组不为空 且 数组长度大于零这种判断如果左边为假右边就不会去取长度避免了空指针。反过来如果把顺序写反就可能先访问空对象直接崩溃。逻辑运算符的书写顺序本身就是一种防御性编程这个意识从第三课就要建立。另外要区分逻辑与和按位与前者操作布尔值且有短路后者操作整数、按位运算、没有短路。考试里经常放在一起混淆。六、键盘输入本课最大的坑6.1 基本流程Java 从键盘读数据用的是 JDK 自带的输入类。流程固定三步先创建输入对象绑定标准输入流再调用对应方法读数据读整数、读小数、读字符串各有各的方法最后用完关闭。注意读整数和读整行字符串用的是不同的方法这一点是下面那个 bug 的根源。6.2 经典 bug先读数字再读整行整行被跳过这是第三课必讲的坑几乎每个人都会踩一次。现象程序先让你输入一个数字你敲了数字按回车接着程序让你输入一行字符串你还没敲它就直接跳过了好像没等你输入一样。原因你敲数字时按下的那个回车被留在了输入缓冲区里。读数字的方法只把数字读走了回车符还留在缓冲区。接下来读整行的方法一执行发现缓冲区里已经有一个回车就把它当成用户输入了一个空行直接返回空字符串于是看起来就像被跳过了。解决办法任选其一理解原理最重要· 在读完整行之前先额外调用一次读整行的方法把残留的回车吃掉· 或者干脆全程都用读整行的方式读到之后再自己转成数字· 或者在读数字之后、读整行之前用读整行方法清一次缓冲区。这个 bug 的本质是输入缓冲区的概念理解了缓冲区后面学文件读写、网络流都是同一个思路。老师上课如果现场演示这个现象实验报告里大概率要写原因分析。6.3 输入的其他注意点· 读小数的方法对本地化敏感某些环境下要求用逗号而不是小数点遇到输入小数报错先想到这个· 输入的数据类型不匹配比如让读整数时敲了字母会抛异常第三课阶段先知道会崩异常处理留到后面讲· 输入对象用完要关闭虽然小程序不关也不影响但养成习惯。七、运算符优先级不必背全表记住三条优先级表很长大二阶段不用全背记住三条实用规则1. 括号优先级最高拿不准就加括号可读性也更好2. 算术 比较 逻辑 赋值这个大体顺序要清楚3. 自增自减、逻辑非这类一元运算符优先级很高容易和后面的运算结合错。工程上的建议很简单复杂表达式一律加括号。省下的那点打字时间远不如排查优先级 bug 花的时间多。八、第三课就该养成的习惯习惯一输入之后立刻校验。 读进来的数据可能是用户乱敲的第三课虽然还不讲异常处理但要有输入不可信的意识这是后面所有交互程序的基础。习惯二不要让自增自减混进表达式。 单独成行代码清晰也避免考试和实战两套思维打架。习惯三逻辑判断把最可能为假、最危险的条件放左边。 利用短路特性做保护这是第三课就能开始练的防御性编程思维。九、课后自测答案在下一课笔记里1. 两个整数相除想得到小数结果有哪几种改法2. 逻辑与和按位与在操作数类型和是否短路这两点上分别有什么区别3. 描述一下先读数字再读整行被跳过的完整原因以及至少两种解决办法。---下一篇预告流程控制——分支与循环。会讲 if-else 的悬挂问题、switch 的穿透现象以及 for 循环里最容易写错的边界条件。第三课输入部分的坑到第四课做菜单程序时会集中爆发。