2011-01-09 81 views
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) ; 
     }  

我對這個代碼oppinion:第一if語句可以去掉,因爲它不會影響其他代碼的執行。除了c1%16與c1%8相同。

我該如何處理循環?

+0

這段代碼很可怕,它從哪裏來的?誰寫的。 – jzd 2011-01-09 14:38:00

+0

的意圖是迷惑讀者,一位助理教授寫了它... – 2011-01-09 14:40:00

+0

請檢查我的答案請:)。 – 2011-01-09 15:19:40

回答

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

一個你刪除,如果完全因爲它在同時已經選中上面。現在,如果你寫的完整代碼,你可以:

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 { 
     c1 += 7; 
     System.out.println(c1); 
    } 
    while (c1 % 8 != 0); 

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

如果你不需要實際打印中間值,您可以在1-2個步驟獲得通過簡單的數學計算最終C1值: - )。

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不做任何事情,否則做循環',使用裸體;之後如果。我想,使其更具可讀性做一樣的東西:

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