我正在练习如何查找和删除死代码。我有以下代码:
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相同。
如何处理循环?
答案 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值: - )。