各種i 和 i面試題測試和過程分析

2021-09-11 03:21:01 字數 1617 閱讀 4265

先看面試題:

第1題:

int i = 5;

求i+=i++;(結果10)

第2題:

int i=12;

求 i+=i-=i*i;(結果-120)

第3題:

int i = 1;

i =i++

int j=i++;

int k = i++ +i*i++;(結果:i為4,j為1,k為11)

第4題:

int i=5;

i= (i++)+(i++)+(++i)+(++i);(結果28)

如果你都做對了就不用往下了。

首先介紹一下區域性變數表和運算元棧(可以簡單了解一下,看不懂也沒關係,應該不會影響看懂分析)

每個方法就是乙個棧幀;

每個方法裡都有自己的區域性變數表和運算元棧(當然還有其他的,這裡只是簡單的圖)

區域性變數表: 存放變數的和變數的當前值得

運算元棧: 在進行運算的時候把區域性變數表中的值載入到這裡邊來執行,運算完後再賦值給區域性變數表中的變 量,賦值後裡邊的值就沒有了。。

先記住以下幾點,很重要,如果分析中有**看不懂的可以回過來看看這幾句是不是都記住了。

*****總結:(首先需要記住這幾點規則)

*1. = 等號賦值最後計算

*2 壓入運算元棧是從做往右壓入的,計算運算元棧的值是遵循執行級別的

3. ++i先自增,再將i的值壓入運算元棧,i++,先將i的值壓入運算元棧後再自增

4. 自增自減是不經過運算元棧的,直接在臨時變數表中自增、自減

5. 最後賦值前,臨時資料在運算元棧中,賦值後棧中就沒了

6. i+++i的本質為(i++) +i ,而不是i+(++i),可以看我另一篇文章的測試過程

怎樣反編譯檢視原始碼:

*常見過程的含義:(不全,簡單介紹一下)

**iconst 載入常量1到運算元棧(bipush也是載入常量到棧)

*istore 將運算元棧的值賦值給區域性變數,常量棧中的值沒了

*iload 將變數的值載入到運算元棧

*iinc 自增

*iadd 把運算元棧的值做加法

前邊都是打基礎,正式開始分析:

舉個簡單的例子:

*int i=1;

*i=++i+i++;

請看分析:

後邊的過程都很相似,所有並沒有很嚴格的全寫,參照第乙個分析,最為詳細,舉一反三即可。

面試題 i 和 i哪個效率更高

include int main 簡單地比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。考慮內建資料型別的時候,它們的效率差別不大 去除編譯器的影響 考慮自定義資料型別 主要是指類 的情況。此時我們不需要再做很多彙編 的分析,因為字首式 i 可以返回物件的引用,...

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...

vipkid面試題 測試工程師i

有乙個無序陣列,找到其中能被2,3整除的數排序,剩下的數也排序後跟在後面 1.排序演算法抽象成方法 2.用效率更高的排序演算法 用 的氣泡排序,大家可以隨意選排序演算法 encoding utf 8 import random import time 生成隨機數 x個 r list for i in...