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 什么都不做,否则做循环',使用裸 ; 如果之后。我会通过执行以下操作使其更具可读性:

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 ; 

第一行和第三行相互抵消..第二行和第四行也是如此。如果像这样删除那些你得到内部的:

if ( c2 < c3 )
{
}

可以消除(也消除对 c2、c3 vars 的需要),从而使封闭语句看起来像这样:

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 );

你完全删除了 if ,因为它已经在上面的 while 中检查过了。现在,如果您编写完整的代码,您将获得:

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 和初始添加/打印,因为第一个 do 循环将具有相同的语义。

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

    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 回答