先看面試題:
第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...