你真的懂 i++ 和 ++i 嗎?

對於 ++i 和 i++,許多人可能都知道,不就是先加1再取值,和先取值再加1嘛。然而,真的是這樣嗎?請先看如下4道題,能所有答對能夠忽略這篇文章。java

題目code

// 示例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);

先彆着急着看答案,先本身思考下,解出本身的答案,而後再往下翻查看答案是否與你的一致。blog

答案數學

示例1:i = 1
示例2:j = 4
示例3:j = 3
示例4:k = 8

你是否發現有些答案和你想的不同,若是我告訴你 ++i 和 i++ 其實都是先計算加1,你是否是更懵逼了!再詳解答案以前,先了解兩個知識點。class

1 i++ 和 ++i 原理變量

  • i++:先自增,再返回自增以前的值
  • ++i:先自增,再返回自增以後的值
  • 不管是前++仍是後++,它們的共同點就是先自增

2 表達式原則原理

一個變量也是表達式,多個表達式的加減法運算都是從左到右進行的,固然乘除法的優先級仍是大於加減法的。im


答案詳解img

// 示例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了。

di

// 示例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。

// 示例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

// 示例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

相關文章
相關標籤/搜索