質問
死んだコードを見つけて削除する方法を練習しています。次のコードがあります。
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と同じです。
ループを処理するにはどうすればよいですか?
解決
私はループの内側のコードから始めます:たとえば、あなたが持っている場合、内側の内側
c1 = c1+c1 ;
c3 ++ ;
c1 /= 2 ;
c3 -= 1 ;
1行目と3行目は互いにキャンセルし、2番目と4番目の行と同じです。このように内側を削除する:
if ( c2 < c3 )
{
}
これを排除することができます(C2、C3 VARの必要性も削除します)したがって、囲まれたステートメントは次のようになります。
do
{
c1 += 7 ;
System.out.println( c1 ) ;
}
while ( c1 % 8 != 0 );
ステップアップして囲いを逆にした場合、/そうでない場合は次のようなものが得られます。
if ( c1 % 16 != 0 )
do
{
c1 += 7 ;
System.out.println( c1 ) ;
}
while ( c1 % 8 != 0 );
else
;
そして、空の他のものを削除することができます。今、あなたが別のステップを上げればあなたは得る:
while (c1 % 8 != 0)
if ( c1 % 16 != 0 )
do
{
c1 += 7 ;
System.out.println( c1 ) ;
}
while ( c1 % 8 != 0 );
上記の間に既にチェックインされているので、完全に削除します。今、あなたが取得する完全なコードを書くならば、
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ループには同じセマンティクスがあるため、最初と初期の追加/印刷を完全に削除できます。
最終的には、次のようなものを取得する必要があります。
do {
c1 += 7;
System.out.println(c1);
}
while (c1 % 8 != 0);
c1 += 7;
System.out.println(c1);
また、中間値を実際に印刷する必要がない場合は、単純な数学を介して1-2ステップで最終C1値を取得できます:-)。
他のヒント
C%16はC%8と同じではありません。 Cが24に等しい場合、前者は8を返し、後者0を返します。Cが32の場合、両方とも0ですが、Cの場合、前者は再び8、後者は0に戻ります。
行4/5/6は最適ではありません。実際に起こっているのは、C1%16!= 0の場合、do/while loopを実行しますが、それが書かれている方法はクロジーです。裸のものを使用して、「C1%16 == 0の場合は何もしないでください」と書かれています。 ifの後。次のようなことをすることで、より読みやすくします。
bool shouldDoLoop = c1 % 16 != 0;
if (shouldDoLoop) {
// do/while here
}