Java在if语句中能否复用同一变量并在判断中途为其重新赋值?
Java表达式变量赋值规则答疑
可行性结论
你描述的写法语法上完全可行,但对Java表达式求值规则不熟悉的情况下极易写出逻辑BUG,属于不推荐的编码实践。
执行逻辑拆解
Java中所有二元运算符的求值顺序严格遵循从左到右原则:先完整计算左侧操作数的结果,再计算右侧操作数的结果,最后执行运算符对应的运算。
针对你给出的代码:
if(curID + 1 != (curID = myScanner.nextInt())) { System.out.print(j++); break; } else { j++; }
判断表达式的执行顺序是固定的:
- 先读取
curID的当前旧值,计算得到旧curID + 1,作为!=运算符的左操作数结果 - 再执行右侧括号内的赋值逻辑:从输入读取新值赋给
curID,此时curID已经被更新为新值,赋值表达式本身的返回值就是这个新输入值,作为!=运算符的右操作数结果 - 最后对比左右两个操作数的结果是否不等,根据结果走对应分支
循环直接退出的原因
你的猜测不成立,表达式并不会两处都使用变量的新值。你遇到直接退出的情况,是因为你本次输入的新值不等于curID旧值加1的结果,触发了if分支的break语句。
你可以用固定值做测试验证:如果初始curID为3,你输入4,此时左操作数是3+1=4,右操作数是新赋值的4,4 != 4结果为假,会进入else分支,不会触发break。
实践建议
这种在判断表达式内复用变量赋值的写法可读性极低,后续维护或其他人修改代码时很容易忽略求值顺序导致出问题,实际开发中还是建议单独声明临时变量存储新读取的输入值,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Anthrac1t3
相关产品推荐
相关产品推荐

