分解循环

时间:2011-01-09 14:22:36

标签: java while-loop do-while

我正在练习如何查找和删除死代码。我有以下代码:

              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相同。

如何处理循环?

2 个答案:

答案 0 :(得分:2)

c%16与c%8不同。如果c等于24,前者返回8,后者返回0.如果c为32,则它们都为0,但如果c为40,则前者再次返回8,后者返回0.

第4/5/6行不是最佳选择。真正发生的是如果c1%16!= 0,那么执行do / while循环,但它的编写方式是cloogy。如果c1%16 == 0,则执行任何操作,否则执行循环',使用裸体;在if之后。通过做类似的事情,我会让它更具可读性:

bool shouldDoLoop = c1 % 16 != 0;
if (shouldDoLoop) {
   // do/while here
}

答案 1 :(得分:1)

我会从循环的内部代码开始: 例如,如果你有

,在内部
c1 = c1+c1 ; 
c3 ++ ; 
c1 /= 2 ; 
c3 -= 1 ; 

第一行和第三行互相取消..和第二行和第四行相同。删除那些你得到内在的东西,如下:

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 
 ;

并且可以删除空的其他内容。现在如果你再迈出一步,你就得到了:

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

你完全删除了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 ) ; 

你可以删除第一个while和初始的add / print,因为第一个do循环将具有相同的语义。

最后你应该得到这样的东西:

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

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

如果您不需要实际打印中间值,您可以通过1-2步骤中的简单数学获得最终的c1值: - )。