冒泡排序法復習下,反編譯后的結果很意外

灬猜想灬 13年前發布 | 2K 次閱讀 ltrace Dropbox WeeChat

下面這個自己寫的冒泡排序法:

class maopao
{
    public static void main(String[] args)
    {
        int[] array = {3,7,8,1,4,65,5,243,55,44};
        int j = 0;
        for (int i = 0; i < array.length - 1; ++i)
        {
            for (j = i + 1; j < array.length; ++j)
            {
                if (array[i] < array[j])
                {
                    array[i] += array[j];
                    array[j] = array[i] - array[j];
                    array[i] -= array[j];
                }
            }
        }
        for (int x : array)
        {
            System.out.printf("%4d",x);
        }
    }
}
這個就不用說了,誰都會的.
然后反編譯看看源碼,尋找可以優化的地方.
這個是jd-gui反編譯出來的:
class maopao
{
  public static void main(String[] paramArrayOfString)
  {
    int[] arrayOfInt1 = { 3, 7, 8, 1, 4, 65, 5, 243, 55, 44 };
    int i = 0;
    for (int j = 0; j < arrayOfInt1.length - 1; j++)
    {
      for (i = j + 1; i < arrayOfInt1.length; i++)
      {
        if (arrayOfInt1[j] >= arrayOfInt1[i])
          continue;
        arrayOfInt1[j] += arrayOfInt1[i];
        arrayOfInt1[j] -= arrayOfInt1[i];
        arrayOfInt1[j] -= arrayOfInt1[i];
      }
    }

for (int n : arrayOfInt1)
{
  System.out.printf("%4d", new Object[] { Integer.valueOf(n) });
}

} }</pre>在互換值的地方,很奇怪,很明顯是有問題的.jd-gui的BUG?</div>

接著繼續使用JODE反編譯看看:
class maopao
{
    public static void main(String[] strings)
    {
        int[] is = { 3, 7, 8, 1, 4, 65, 5, 243, 55, 44 };
        boolean bool = false;
        for (int i = 0; i < is.length - 1; i++)
        {
            for (int i_0_ = i + 1; i_0_ < is.length; i_0_++)
            {
                if (is[i] < is[i_0_])
                {
                    is[i] += is[i_0_];
                    is[i_0_] = is[i] - is[i_0_];
                    is[i] -= is[i_0_];
                }
            }
        }
        int[] is_1_ = is;
        int i = is_1_.length;
        for (int i_2_ = 0; i_2_ < i; i_2_++)
        {
            int i_3_ = is_1_[i_2_];
            System.out.printf("%4d", new Object[] { Integer.valueOf(i_3_) });
        }
    }
}
在互換值的地方是沒問題了,完全復原了代碼,但是......
不知道多聲明的一個Boolean變量怎么出來的,還有JODE覺得foreach循環必須優化為原始for循環嗎?
Java自帶的javap反編譯出來時看不到完整代碼,只能看到類,方法,屬性的定義.
Compiled from "maopao.java"
class maopao extends java.lang.Object
{
    maopao();
    public static void main(java.lang.String[]);
}
jad的反編譯器懶得去下載了.
看來不同反編譯器還是有差距的啊.</div>
JODE還好,反編譯出來的代碼至少能保證正確運行.
平常一直使用jd-gui,而且還會自動做一些代碼優化.
如果在交換值的地方使用臨時變量來幫助交換值,jd-gui反編譯回來也是沒問題的.如下:
public static void main(String[] paramArrayOfString)
{
    int[] arrayOfInt1 = { 1, 3, 5, 2, 9, 10, 23, 11 };
    int i = 0;
    int k;
    for (int j = 0; j < arrayOfInt1.length - 1; j++)
    {
        for (k = j + 1; k < arrayOfInt1.length; k++)
        {
            if (arrayOfInt1[k] <= arrayOfInt1[j])
                continue;
            i = arrayOfInt1[j];
            arrayOfInt1[j] = arrayOfInt1[k];
            arrayOfInt1[k] = i;
        }
    }
}

 本文由用戶 灬猜想灬 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
寫博客

博客分類