你真的懂 i 和 i 嗎?

2022-07-01 13:09:09 字數 2653 閱讀 4250

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

題目

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

先別著急著看答案,先自己思考下,解出自己的答案,然後再往下翻檢視答案是否與你的一致。

答案

示例1:i = 1

示例2:j = 4

示例3:j = 3

示例4:k = 8

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

1 i++ 和 ++i 原理

2 表示式原則

乙個變數也是表示式,多個表示式的加減法運算都是從左到右進行的,當然乘除法的優先順序還是大於加減法的。

答案詳解

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

// 示例2 結果:j = 4

int i = 1;

int j = (2 * i++) + i;

system.out.println("j = " + j);

根據表示式原則,乙個變數也是表示式,多個表示式的加減法運算都是從左到右進行的優先運算左邊的表示式,即(2 * i++),i++後,i 的值為2,並返回自增之前的值1

此時表示式為 int j = (2 * 1) + i ,i 的值已經是2了

最後表示式變為 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,然而這答案是錯誤的。正確邏輯如下:

根據表示式原則,乙個變數也是表示式,多個表示式的加減法運算都是從左到右進行的

int j = i + (2 * i++) 先算 + 號左邊 i 這個表示式,表示式的結果為1

表示式變為 j = 1 + (2 * i++)

再計算 + 號右邊的表示式,然後 i 自增並返回自增之前的值1,表示式又變為 j = 1 + (2 * 1)

最終結果為 j = 3,此時 i 的值為2

// 示例4 結果:k = 8

int i = 1;

int j = 1;

int k = i++ + ++i + ++j + j++;

system.out.println("k = " + k);

先計算 i++,i++ 之後 i 的值為2,並返回自增之前的值1,表示式變為 1 + ++i + ++j + j++。此時的 i 值為2

再計算 ++i,++i 之後 i 的值為3,並返回自增之後的值3,表示式變為 1 + 3 + ++j + j++。此時 i 的值為3

再計算 ++j,++j 之後 j 的值為2,並返回自增之後的值2,表示式變為 1 + 3 + 2 + j++。此時 j 的值為2

再計算 j++,j++之後 j 的值為3,並返回自增之前的值2,表示式變為 1 + 3 + 2 +2,即結果為8,此時j的值為3

你真的懂迴圈嗎

好了今天我來講講什麼是迴圈吧,你又真的懂迴圈嗎?讓我來講講迴圈的細節吧和判斷吧 1 for迴圈樣式 for var i 0 i 5 i 它的條件表示式就是先寫for 在寫內部的條件,在js中宣告變數也是可以不加var直接就可以 for i 0 i 5 i 但這樣寫也有一點不對,因為i時區域性變數最好...

你真的懂程式設計嗎?

還記得自己剛學習程式設計的時候,是在大一學習c語言的時候,那時在學習程式設計的時候,一遇到一些問題就開始在網上或者書上找有沒有現成的程式。找到後就把它們稍作修改從而實現自己想要的功能,以為這就是程式設計。到後面自己學習微控制器程式設計的時候也是這樣,雖然我可以實現功能。但是就是感覺自己其實也沒做多少...

你真的懂素數嗎?

素數 即質數 定義 大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數 即除了1和本身沒有其他因子 首先,我們先來看乙個數與其因子有什麼關係 除了本身的因子 因子 數本身 2 如10 的因子 1 2 5 因為2 5 10 5是10的1 2 如果a因子大於5,則b因子就必須是 1,2 即...