int i=0;对i=i++多次循环后为什么i结果为0

本文深入探讨Java中i=i++与i=++i运算符的底层实现原理,揭示了JVM执行过程中变量区与堆栈间的交互机制,以及自增操作的实际执行顺序。
今天同事考我一个题求下面代码的结果,我以为是99,没想到运行结果是0,后来百度了下原来是java底层jvm执行方式导致的。
public class JTest {
    public static void main(String[] args) {
        int i=0;
        for (int n=0;n<100;n++){
            i=i++;
        }
        System.out.println(i);
    }
}

按网上的解释i=i++在jvm中会在变量区中存在初始变量i,然后将i拷贝一份到堆栈(暂存区),之后变量区中的i会自增1,但最后会将堆栈中的i赋值给变量区的i,并释放堆栈空间,所以i=i++得到的值是变量区中i的值即为0。(下面图可以辅助理解,不过是盗的……)

这样就可以理解原来i++底层并不是真的先赋值再自增,自增其实也是在赋值之前。

那如果是i=++i虽然结果为100在意料之中,不过还是说一下流程:

1、变量区中的i拷贝一份到堆栈(暂存区)

2、变量区i自增1

3、将变量区i赋值给堆栈i

4、将堆栈i赋值给变量区,释放堆栈空间

 

 

 

 

<think>我们被要求详细解释代码段 `int i = 0; i < n; i++`,该代码段通常出现在for循环中。 这个代码段是for循环的三个部分:初始化、条件判断和更新。 具体分解: 1. `int i = 0;`:这是循环的初始化部分,在循环开始前执行一次。它声明了一个整数变量`i`并将其初始化为0。 2. `i < n;`:这是循环的条件判断部分。在每次循环迭代开始前,都会检查这个条件。如果条件为真(即`i`小于`n`),则执行循环体内的代码;否则,循环终止。 3. `i++`:这是循环的更新部分。在每次循环体执行完毕后,会执行这个语句。`i++`是后缀自增运算符,表示先使用`i`的当前值,然后将`i`的值增加1。 整个for循环的结构如下: for (初始化; 条件; 更新) { 循环体 } 执行顺序: 1. 执行初始化语句(仅一次) 2. 检查条件:若条件为真,则执行循环体;若为假,则退出循环。 3. 循环体执行完毕后,执行更新语句。 4. 回到步骤2(检查条件),如此往复。 示例:计算从0到n-1的整数和 ```c int sum = 0; for (int i = 0; i < n; i++) { sum += i; } ``` 引用中提到了关于i++++i的区别(引用[1]): - `i++`:后缀自增,先使用i的当前值,然后i的值增加1。 - `++i`:前缀自增,先将i的值增加1,然后使用i的新值。 在for循环的更新部分,使用`i++`和`++i`效果是一样的,因为更新部分是一个单独的语句,不涉及在表达式中使用值。但它们在表达式中使用时有区别。 例如: ```c int a = i++; // 相当于:a = i; i = i+1; int b = ++i; // 相当于:i = i+1; b = i; ``` 在循环的更新部分,我们通常只关心将i增加1,而不使用其返回值,所以两者效果相同。 另外,在引用[2][3][4]中,我们看到多个for循环的例子,它们都使用了这种结构。 总结: 代码段 `int i = 0; i < n; i++` 是for循环的头部,它控制循环执行n次,循环变量i从0开始,每次循环增加1,直到i等于n(此时条件i<n不成立)时退出循环。 </think>### 逐步解析:`for (int i = 0; i < n; i++)` 的含义 #### 1. 代码结构分解 ```cpp for (初始化语句; 循环条件; 增量表达式) { // 循环体代码 } ``` - **初始化语句**:`int i = 0` 首次循环前执行一次,声明循环计数器`i`并初始化为`0` - **循环条件**:`i < n` 每次循环前检查:若`i`小于`n`则执行循环体,否则退出循环 - **增量表达式**:`i++` 每次循环体执行后执行,等价于`i = i + 1` #### 2. 执行流程详解 | 步骤 | 操作 | 变量状态 ($i$) | 是否继续循环 | |------|--------------------------|----------------|--------------| | 1 | 初始化 `i = 0` | `i=0` | - | | 2 | 检查 `0 < n` (假设 $n>0$) | `i=0` | 是 | | 3 | 执行循环体 | `i=0` | - | | 4 | 执行 `i++` → `i=1` | `i=1` | - | | 5 | 检查 `1 < n` | `i=1` | 是 | | ... | ... | ... | ... | | k | 检查 `(n-1) < n` | `i=n-1` | 是 | | k+1 | 执行 `i++` → `i=n` | `i=n` | - | | k+2 | 检查 `n < n` | `i=n` | **否** | #### 3. 关键概念解析 1. **循环范围**: - 精确执行 $n$ 次循环($i$ 从 $0$ 到 $n-1$) - 示例:若 $n=5$,$i$ 取值 $\{0,1,2,3,4\}$ 2. **`i++` vs `++i`** (引用[1]): ```cpp int a = i++; // 等价:a = i; i = i+1; (先使用后增加) int b = ++i; // 等价:i = i+1; b = i; (先增加后使用) ``` - 在 `for` 循环中两者效果相同,因不涉及表达式求值 - 性能差异:在C++中优化后无区别,但`++i`更符合习惯 #### 4. 经典应用场景 1. **数组遍历** (引用[2]): ```cpp for (int i = 0; i < n; i++) { cout << array[i]; // 访问索引i的元素 } ``` 2. **累加计算** (引用[3]): ```cpp int sum = 0; for (int i = 1; i <= 100; i++) { // 类似结构 sum += i; // 计算1+2+...+100 } ``` 3. **嵌套循环** (引用[4]): ```cpp for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { // 处理矩阵元素matrix[i][j] } } ``` #### 5. 等价代码实现 ```cpp // 等价while循环实现 int i = 0; // 初始化 while (i < n) { // 条件检查 // 循环体代码 i++; // 增量 } ``` #### 6. 时间复杂度分析 - **时间复杂度**:$O(n)$ 循环次数与 $n$ 成正比,例如: - $n=1000$ → 1000次迭代 - $n=10000$ → 10000次迭代
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值