你真的懂 i++ 和 ++i 嗎?
阿新 • • 發佈:2021-03-16
對於 ++i 和 i++,許多人可能都知道,不就是先加1再取值,和先取值再加1嘛。然而,真的是這樣嗎?請先看以下4道題,能全部答對可以忽略這篇文章。
**題目**
```java
// 示例1
int i = 1;
i = i++;
System.out.println("i = " + i);
// 示例2
int i = 1;
int j = (2 * i++) + i;
System.out.println("j = " + j);
// 示例3
int i = 1;
int j = i + (2 * i++);
System.out.println("j = " + j);
// 示例4
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++;
System.out.println("k = " + k);
```
先彆著急著看答案,先自己思考下,解出自己的答案,然後再往下翻檢視答案是否與你的一致。
![](https://img2020.cnblogs.com/blog/1679187/202103/1679187-20210315233253474-2067302120.jpg)
**答案**
```java
示例1:i = 1
示例2:j = 4
示例3:j = 3
示例4:k = 8
```
你是否發現有些答案和你想的不一樣,如果我告訴你 ++i 和 i++ 其實都是先計算加1,你是不是更懵逼了!再詳解答案之前,先了解兩個知識點。 **1 i++ 和 ++i 原理** - `i++`:先自增,再返回自增之前的值 - `++i`:先自增,再返回自增之後的值 - 不論是前++還是後++,它們的共同點就是`先自增`。 **2 表示式原則** 一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的,當然乘除法的優先順序還是大於加減法的。
**答案詳解** ```java // 示例1 結果:i = 1 int i = 1; i = i++; System.out.println("i = " + i); ``` 根據原理,`先自增,再返回自增之前的值`,i 自增後,i = 2,然後返回自增之前的值1,此時表示式變成 i = 1,1沒賦值給 i 時 i 的值是2,但最後把1賦值給 i 時,i 的值就又變成1了。
```java // 示例2 結果:j = 4 int i = 1; int j = (2 * i++) + i; System.out.println("j = " + j); ``` 根據表示式原則,`一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的` 1. 優先運算左邊的表示式,即(2 * i++),i++後,i 的值為2,並返回自增之前的值1 2. 此時表示式為 int j = (2 * 1) + i ,i 的值已經是2了 3. 最後表示式變為 int j = (2 * 1) + 2 ,於是 j = 4。
```java // 示例3 結果:j = 3 int i = 1; int j = i + (2 * i++); System.out.println("j = " + j); ``` 按數學思維,我們可能會先計算 2 * i++ 部分,i 先自增 i = 2,然後返回自增之前的值1,此時表示式變為 int j = i + (2 * 1) 。此時 i 的值為2了,故表示式又變為 int j = 2 + (2 * 1) ,結果 j = 4,然而這答案是錯誤的。正確邏輯如下: 根據表示式原則,`一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的`。 1. int j = i + (2 * i++) 先算 + 號左邊 i 這個表示式,表示式的結果為1 2. 表示式變為 j = 1 + (2 * i++) 3. 再計算 + 號右邊的表示式,然後 i 自增並返回自增之前的值1,表示式又變為 j = 1 + (2 * 1) 4. 最終結果為 j = 3,此時 i 的值為2
```java // 示例4 結果:k = 8 int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println("k = " + k); ``` 1. 先計算 i++,i++ 之後 i 的值為2,並返回自增之前的值1,表示式變為 1 + ++i + ++j + j++。此時的 i 值為2 2. 再計算 ++i,++i 之後 i 的值為3,並返回自增之後的值3,表示式變為 1 + 3 + ++j + j++。此時 i 的值為3 3. 再計算 ++j,++j 之後 j 的值為2,並返回自增之後的值2,表示式變為 1 + 3 + 2 + j++。此時 j 的值為2 4. 再計算 j++,j++之後 j 的值為3,並返回自增之前的值2,表示式變為 1 + 3 + 2 +2,即結果為8,此時j的值為3
![](https://img2020.cnblogs.com/blog/1679187/202103/1679187-20210315233308162-2102098682.png)
你是否發現有些答案和你想的不一樣,如果我告訴你 ++i 和 i++ 其實都是先計算加1,你是不是更懵逼了!再詳解答案之前,先了解兩個知識點。 **1 i++ 和 ++i 原理** - `i++`:先自增,再返回自增之前的值 - `++i`:先自增,再返回自增之後的值 - 不論是前++還是後++,它們的共同點就是`先自增`。 **2 表示式原則** 一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的,當然乘除法的優先順序還是大於加減法的。
**答案詳解** ```java // 示例1 結果:i = 1 int i = 1; i = i++; System.out.println("i = " + i); ``` 根據原理,`先自增,再返回自增之前的值`,i 自增後,i = 2,然後返回自增之前的值1,此時表示式變成 i = 1,1沒賦值給 i 時 i 的值是2,但最後把1賦值給 i 時,i 的值就又變成1了。
```java // 示例2 結果:j = 4 int i = 1; int j = (2 * i++) + i; System.out.println("j = " + j); ``` 根據表示式原則,`一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的` 1. 優先運算左邊的表示式,即(2 * i++),i++後,i 的值為2,並返回自增之前的值1 2. 此時表示式為 int j = (2 * 1) + i ,i 的值已經是2了 3. 最後表示式變為 int j = (2 * 1) + 2 ,於是 j = 4。
```java // 示例3 結果:j = 3 int i = 1; int j = i + (2 * i++); System.out.println("j = " + j); ``` 按數學思維,我們可能會先計算 2 * i++ 部分,i 先自增 i = 2,然後返回自增之前的值1,此時表示式變為 int j = i + (2 * 1) 。此時 i 的值為2了,故表示式又變為 int j = 2 + (2 * 1) ,結果 j = 4,然而這答案是錯誤的。正確邏輯如下: 根據表示式原則,`一個變數也是表示式,多個表示式的加減法運算都是從左到右進行的`。 1. int j = i + (2 * i++) 先算 + 號左邊 i 這個表示式,表示式的結果為1 2. 表示式變為 j = 1 + (2 * i++) 3. 再計算 + 號右邊的表示式,然後 i 自增並返回自增之前的值1,表示式又變為 j = 1 + (2 * 1) 4. 最終結果為 j = 3,此時 i 的值為2
```java // 示例4 結果:k = 8 int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println("k = " + k); ``` 1. 先計算 i++,i++ 之後 i 的值為2,並返回自增之前的值1,表示式變為 1 + ++i + ++j + j++。此時的 i 值為2 2. 再計算 ++i,++i 之後 i 的值為3,並返回自增之後的值3,表示式變為 1 + 3 + ++j + j++。此時 i 的值為3 3. 再計算 ++j,++j 之後 j 的值為2,並返回自增之後的值2,表示式變為 1 + 3 + 2 + j++。此時 j 的值為2 4. 再計算 j++,j++之後 j 的值為3,並返回自增之前的值2,表示式變為 1 + 3 + 2 +2,即結果為8,此時j的值為3
![](https://img2020.cnblogs.com/blog/1679187/202103/1679187-20210315233308162-2102098682.png)