對於 ++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);
根據表達式原則,一個變量也是表達式,多個表達式的加減法運算都是從左到右進行的
// 示例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,然而這答案是錯誤的。正確邏輯以下:
根據表達式原則,一個變量也是表達式,多個表達式的加減法運算都是從左到右進行的
。
// 示例4 結果:k = 8 int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println("k = " + k);