0

デッドコードを見つけて削除する方法を練習しています。次のコードがあります。

              int c1 = Integer.parseInt(args[0]) ;
           int c2 = Integer.parseInt(args[1]) ;
           int c3 = Integer.parseInt(args[2]) ;

/*  1 */           c1 += 7 ; 
/*  2 */           System.out.println( c1 ) ; 

/*  3 */       while (c1 % 8 != 0)
/*  4 */              if ( c1 % 16 == 0 ) ; 
/*  5 */              else
/*  6 */         do 
/*  7 */                 {
/*  8 */                    c1 += 7 ; 
/*  9 */                    System.out.println( c1 ) ; 
/* 10 */                    if ( c2 < c3 )
/* 11 */                       { c1 = c1+c1 ; 
/* 12 */                         c3 ++ ; 
/* 13 */                         c1 /= 2 ; 
/* 14 */                         c3 -= 1 ; 
/* 15 */                       }
/* 16 */                 }
/* 17 */                 while ( c1 % 8 != 0 ) ;

/* 18 */           c1 += 7 ; 
/* 19 */           System.out.println( c1 ) ; 
        }     

このコードに関する私の意見: 最初に if ステートメントを削除できます。これは、残りのコードの実行に影響を与えないためです。また、c1%16 は c1%8 と同じです。

ループを処理するにはどうすればよいですか?

4

2 に答える 2

2

c%16 は c%8 と同じではありません。c が 24 の場合、前者は 8 を返し、後者は 0 を返します。c が 32 の場合、両方とも 0 になりますが、c が 40 の場合、前者は再び 8 を返し、後者は 0 を返します。

行 4/5/6 は最適ではありません。実際に起こっていることは、c1%16 != 0 の場合、do/while ループを実行することですが、その書き方はお粗末です。「c1%16 == 0 の場合は何もせず、それ以外の場合はループを実行する」と書かれています。ifの後。次のようにして読みやすくします。

bool shouldDoLoop = c1 % 16 != 0;
if (shouldDoLoop) {
   // do/while here
}
于 2011-01-09T14:30:30.653 に答える
1

ループの内側のコードから始めます。

c1 = c1+c1 ; 
c3 ++ ; 
c1 /= 2 ; 
c3 -= 1 ; 

1 行目と 3 行目は互いに打ち消し合い、2 行目と 4 行目も同様です。次のような場合は、インナーを取得するものを削除します。

if ( c2 < c3 )
{
}

これは削除できます(c2、c3変数の必要性も削除されます)。したがって、囲みステートメントは次のようになります。

do 
{
  c1 += 7 ; 
  System.out.println( c1 ) ; 
}
while ( c1 % 8 != 0 );

ステップアップして囲んでいる if/else を逆にすると、次のようになります。

if ( c1 % 16 != 0 )
    do 
    {
      c1 += 7 ; 
      System.out.println( c1 ) ; 
    }
    while ( c1 % 8 != 0 );
else 
 ;

空のelseは削除できます。さらにステップアップすると、次のようになります。

while (c1 % 8 != 0)
  if ( c1 % 16 != 0 )
    do 
    {
      c1 += 7 ; 
      System.out.println( c1 ) ; 
    }
    while ( c1 % 8 != 0 );

上記の while で既にチェックインされているため、 if を完全に削除します。完全なコードを書くと、次のようになります。

c1 += 7 ; 
System.out.println( c1 ) ; 

while (c1 % 8 != 0)
  do 
  {
    c1 += 7 ; 
    System.out.println( c1 ) ; 
  }
  while ( c1 % 8 != 0 );

c1 += 7 ; 
System.out.println( c1 ) ; 

最初の do ループは同じセマンティクスを持つため、最初の while と最初の add/print を完全に削除できます。

最終的に、次のようなものを取得する必要があります。

    do {
        c1 += 7;
        System.out.println(c1);
    }
    while (c1 % 8 != 0);

    c1 += 7;
    System.out.println(c1);

中間値を実際に出力する必要がない場合は、簡単な数学を使用して 1 ~ 2 ステップで最終的な c1 値を取得できます :-)。

于 2011-01-09T14:33:13.533 に答える