Вывести петли - PullRequest
       8

Вывести петли

0 голосов
/ 09 января 2011

Я практикую, как найти и удалить мертвый код. У меня есть следующий код:

              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 ]

2 голосов
/ 09 января 2011

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
}
1 голос
/ 09 января 2011

Я бы начал с внутреннего кода цикла: например, внутри внутреннего, если у вас есть

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

An, вы полностью удалите 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 и начальное добавление / печать, поскольку первый цикл do будет иметь ту же семантику.

В конце вы должны получить что-то вроде этого:

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

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

И если вам не нужно фактически печатать промежуточные значения, вы можете получить окончательное значение c1 с помощью простой математики в 1-2 шага: -).

...