我认为的j++和++j

今天偶然看到了一段代码
int j=0;
for(int i=0;i<5;i++){
j=j++;
}
System.out.println(j);
这个结果输出是0;
我对此很纳闷,按照我的理解是j++应该是先赋值,然后j再做运算,但是在循环体中,j的结果也应该是变得。
后来看了一遍文章了解到,这是涉及到jvm存储区的知识,即有堆栈区和变量区,意思就是 j=j++这条语句,先是将j的原始数据放入堆栈区,然后在变量区对j进行自增运算,最后将堆栈区的值再赋予j,即j为0;
而对于++j,则是先运算再赋值,即先在变量区进行运算,随后将值赋予到堆栈区,最后从堆栈区中取值。
这也是看到一篇文章才明白的。
原地址:https://blog.youkuaiyun.com/weixin_37672169/article/details/79409216

### C/C++ 中 `i++` `++i` 的区别及使用场景 #### 基本概念 在 C/C++ 编程语言中,`i++` `++i` 都是用来实现变量自增的操作符。然而,它们的行为存在显著差异。 - **后置自增 (`i++`)** 后置自增操作符会在返回当前值后再增加变量的值[^2]。这意味着当它被用作表达式的一部分时,会先返回原始值给调用者,随后才对变量本身进行加一操作。 - **前置自增 (`++i`)** 前置自增操作符则是在实际应用该变量前就将其数值增加一[^3]。因此,在任何依赖此变量的结果计算之前,它的新值已经被更新并可用。 #### 效率比较 从性能角度来看,通常认为前置形式更高效一些,因为它不需要创建额外的对象来保存旧状态副本以便后续可能需要用到原初数据的情况发生;而相比之下,后缀版本由于要保留原来的那个数作为结果反馈出去所以可能会涉及更多的内存分配过程或者拷贝动作[^1]。 #### 使用实例分析 ##### 赋值语句中的表现 考虑如下代码片段: ```cpp int i = 1; int y; y = i++; // 此处相当于:取到的是未变化之前的i值即1,接着才是让i变为2. // 所以最终得到y等于1,i变成2. // 对应伪码解释: /* i=1; y=i; // 将此时的i赋给了y i=i+1; // 自身完成增值操作 */ printf("After post-increment (i++), y=%d and i=%d\n", y, i); y = ++i; // 这里代表先做一次增量处理使i成为新的值也就是再次加成后的样子再拿去参与运算, // 即先把i设为了3之后再把这最新的情况赋予了y. // 对应伪码解释: /* i=2; i=i+1; // 先执行加法使得i变成了3 y=i; // 把现在这个已经改变了的状态下的i复制过去给y */ printf("After pre-increment (++i), y=%d and i=%d\n", y, i); ``` 上述例子清晰展示了两者如何影响程序逻辑走向的不同之处. ##### 循环控制结构内的运用 另一个常见的应用场景就是在循环体内部充当计数器角色的时候: ```cpp for(int j=0;j<5;++j){ cout<<j<<" "; } cout<<"\n"; /* 输出将是: 0 1 2 3 4 */ ``` 这里采用的就是前置方式(++j),这样可以保证每次迭代开始之时所打印出来的都是经过调整过的新索引号而不是上一轮遗留下来的旧编号. 如果换成后置形式(j++)的话虽然也能达到相同的效果但是理论上讲每轮都需要多耗费一点资源用来暂存一下即将废弃掉的那个老版本的数据项直到整个流程结束为止才会释放这些无谓占用的空间位置出来重新利用起来从而造成不必要的浪费现象出现. --- ### 总结 综上所述,无论是出于优化目的还是单纯为了编写更加直观易懂易于维护管理的良好风格习惯而言都建议尽可能多地选用前置型式的写法除非确实有特殊需求必须依靠后者才能满足特定业务规则的要求才行[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值