自增自减运算符写在变量前还是后,结果真不一样
Java里
和
不是等价的,区别在「表达式的值」——前者返回自增后的值,后者返回自增前的值。很多人只记“前++先加后用,后++先用后加”,但没意识到这直接影响赋值、循环条件、甚至方法参数求值顺序。
在
中,
拿到的是旧值,
才变
在
中,
先加1,
拿到新值
用在
循环里(如
),执行顺序就容易出错
JVM按从左到右求值,但自增/自减的副作用发生时机紧贴其所在位置,不是统一延后
在for循环里用
还是
?性能有差别吗
单纯作为循环步进语句时,
和
生成的字节码完全一样(JDK 8+,HotSpot JVM)。编译器做了优化:当表达式值被丢弃时,两者无差异。
反例:
或
效果一致,别为“效率”强行改
但若写成
不要依赖“前缀更快”的直觉;真正影响性能的是重复调用
这种开销,而不是自增写法
用在布尔值、字符串或对象上会报错
Java的自增自减只支持数值类型(
、
、
、
、
、
、
),且不支持自动装箱后的包装类(如
)直接参与运算。
→ 编译错误:
→ 编译错误,字符串不可自增
看似能过,其实是自动拆箱→自增→重新装箱,但若
为
,运行时抛
数组长度、集合大小等是只读属性,
或
直接编译失败
复合赋值+自增混用时,注意优先级和副作用时机
像
这类表达式,表面看是数学运算,实际是未定义行为的温床——不是Java规范不允许,而是它明确要求“操作数从左到右求值”,但各子表达式的副作用(即
的变化)穿插其中,极易误判。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
例如:
→ 先取
旧值1(
部分),
变为2;
→ 再执行
,
变3并取3;
→ 所以
,
但换成
,结果仍是4,而
最终是3 —— 不要指望靠“多试几次”来验证,应避免这种写法
真实项目里出现这类代码,99% 是可读性灾难,也难调试;用临时变量拆解更安全
最常被忽略的点是:自增自减的副作用发生在整个表达式求值过程中的具体位置,而不是“语句结束时”。哪怕只是多嵌套一层方法调用或三元运算,都可能让执行顺序变得反直觉。写的时候手快,读的时候得逐行推导字节码逻辑。
++ii++int a = i++;aiint b = ++j;jbforfor (int i = 0; i )看似安全,但一旦混进复杂表达式(比如arr[i++] = ++counti++++ii++++ifor (int i = 0; i —— 这里用i++++iwhile (i++ ,逻辑就和while (++i 不同了,边界行为会偏移1list.size()++byteshortcharintlongfloatdoubleIntegerboolean flag = true; flag++;bad operand type boolean for unary operator '++'String s = "a"; s++;Integer x = 5; x++;xnullNullPointerExceptionarr.length++list.size()++i += ++i + i++iint i = 1; int j = i++ + ++i;ii++i++iij = 1 + 3 == 4i == 3i = i++ + ++i;i