这是段反编译的代码,经过我简化,但结构不变.
void foo(int a,int b,int c)
{
int k = b;
if( a == 0) goto _L2; else goto _L1
_L1:
        k++;
_L2:
        if(k < c) goto _L1; else goto _L3
_L3:
return;
}我还原成java 写成
void foo(int a,int b){
 int k = b;
 if(a==0) {
   while(k<c) { k++; }
 }
 else
 {
  do{ k++; }while(k<c)
 }
}我相信原始的代码肯定没有这么复杂,有人能给出最优的解法吗?

解决方案 »

  1.   

    private static void   foo1(int   a,int   b,int c){ 
      int k = Math.max(b,c)+(a==0?0:b/c);
      System.out.println(k);
      

  2.   

    非常感谢shan1119 的回答,但我要说明一下程序并没有调用任何库.
    上面那个我写的有些问题,重新发一遍题目//JAVA反编译代码如下:
    int foo(int a,int b,int c) 

    int k = b; 
    if( a == 0) goto _L2; else goto _L1 
    _L1: 
    k++; 
    _L2: 
    if(k < c) goto _L1; else goto _L3 
    _L3: 
    return k; 
    } //我手动还原后的代码如下:
    int foo(int a,int b,int c)

    int k = b; 
    if(a==0)

    while( k <c )

    k++;


    else
    {
    do

    k++;  }while(k <c);
    }
    return k;
    } 请问各位还有没有更优的解法?
      

  3.   

    不用库涵数,也可以改一下.
    private static void   foo1(int   a,int   b,int c){ 
    int k = b;
    if(k<c)k=c;
    k+=(a==0?0:b/c);
            System.out.println(k);
      

  4.   

    源码,和编译后的代码,不是一一对应的关系啊。a = 2 * 2;可能被翻译为
    a = 2 * 2;
    a = 2 + 2;
    a = 2 << 1;
    a = 4;但是不可逆着一定推出什么了。我觉得shan写得就很好了,而且比那两个C++的星星写得好。
      

  5.   

    源码和编译后的代码,的确不是一一对应的关系,但程序执行的逻辑结构是不会变的. 
    private static void   foo1(int   a,int   b,int c){ 
            int k = b;
            if(k<c)k=c;
            k+=(a==0?0:b/c);
            System.out.println(k);
            } 这样的 private static void   foo1(int   a,int   b,int c){ 
            int k = b;
            if(k<c)k=c;
            k+=(a==0?0:b/c);
            System.out.println(k);
            } 或者这样int   foo(int   a,   int   b,   int   c)   { 
            return   (b <c)   ?   c   :   (a   ?   (b+1)   :   b); 
    }或者这样int   foo(int   a,   int   b,   int   c) 

            return   c==0?b:b+1; 
    }代码不可能会编译成void   foo(int   a,int   b,int   c) 

    int   k   =   b; 
    if(   a   ==   0)   goto   _L2;   else   goto   _L1 
    _L1: 
                    k++; 
    _L2: 
                    if(k   <   c)   goto   _L1;   else   goto   _L3 
    _L3: 
    return; 
    } 编译器不会高明到把几个简单的判断变成循环吧.
      

  6.   

    好象是只有循环的情况下才会出现 goto
      

  7.   

    老比尔是谁? 此话怎讲? 你去MS面试被BS了?
      

  8.   

    我并不是要简单的取得一个返回值,这样吧我再改一下题目//反编译代码如下:
    int foo2(int k)
    {
    ...do something
    }int foo(int a,int b,int c)
    {
          int k = b;
          if( a == 0) goto _L2; else goto _L1
    _L1:
          foo2(k);
          k++;
    _L2:
          if(k < c) goto _L1; else goto _L3
    _L3:
          return k;
    }//我手动还原后的代码如下:
    int foo2(int k)
    {
    ...do something
    }int foo(int a,int b,int c)
    {
      int k = b;
      if(a==0)
      {
        while( k < c )
        {
          foo2(k);
          k++;
        }
      }
      else
      {
        do
        {
          foo2(k);
          k++;
        }while(k < c);
      }
      return k;
    }我相信原始的代码没有这么复杂 请教各位更优的解法
      

  9.   

    被MS BS不算什么,说明他们暂时不想弄Java。继续努力,直到有一天MS收购了SUN,你再去
      

  10.   

     private static void   foo1(int   a,int   b,int c){ 
              int k = b<c?c:(a==0?b:b+1);
              System.out.println(k);
           } 
      

  11.   

    回复16楼:int foo2(int k) {
      //do   something 
    }int foo(int a, int b, int c) {
      int k = b;
      if (a!=0)
        foo2(k++);
      while (k<c) foo2(k++);
      return k;
    }
      

  12.   

    public static int foo(int a, int b, int c) {
         int k = (a == 0) ? b : b + 1;
         while (k < c) k++;
         return k;
    }或者:public static int foo(int a, int b, int c)
    {
        int k;
        for(k = a == 0 ? b : b + 1; k < c; k++);
        return k;
    }
      

  13.   


    public static void foo1(int a,int b,int c){
      for ( int k = b; k < c; k = (a!=0?(k+1):k)){
      }
    }
      

  14.   

    抱歉,前面写错了点~void foo(int a,int b,int c){    
      for (int k=(a!=0?b+1:b); k<c; k++){
      }
    }
      

  15.   

    给你带个返回值int foo(int a,int b,int c){
      int k = b;
      for(k=(a!=0?k+1:k); k<c; k++){
      }
      return k;
    }
      

  16.   

    可能是文件被混淆过的
    这样不知道对不对?void foo(int a, int b, int c) {
    int k = b;
    if (a != 0) {
    k++;
    }
    while (k < c) {
    k++;
    }
    }