Co to jest poprawny sposób przekonwertować z pętli for do pętli while?

głosy
1

Mam do pętli w postaci:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

I chcę, aby przekształcić go w pętli while (głównie dlatego, że chcę grać z wartością iwewnątrz pętli, aby przejść do tyłu i do przodu i mój współpracownik uważa, że robi to w pętli for jest podatne na problemy. I mają tendencję do zgadzam się z nim). Więc napisałem coś takiego:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

Co skłoniło niektóre niektóre głośne komentarze. Moje rozumowanie jest to, że nie wiem co to jest kod wewnątrz pętli nie - to może (i robi) mają wiele continuepoleceń.

W odpowiedzi napisał tak:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

Przyznano jej mniej linii, ale nadal uważam, że mój kod jest bardziej eleganckie - co o tym sądzisz?

Utwórz 03/11/2009 o 18:26
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
3

I chcę, aby przekształcić go w pętli while (głównie dlatego, że chcę grać z wartością I wewnątrz pętli, aby przejść do tyłu i do przodu i mój współpracownik uważa, że ​​robi to w pętli for jest podatne na problemy. Mam tendencję zgodzić się z nim).

To jest całkowicie dopuszczalne w większości języków. Nie ma powodu, aby uniknąć pętli for.

Odpowiedział 03/11/2009 o 18:30
źródło użytkownik

głosy
5

Odtwarzanie z wartością indeksu podczas gdy w strukturze pętli jest podatne na problemy, bez względu na to jaka jest struktura pętli .

To nie będzie ważne, czy jest to dla pętli lub pętli while, chodzi o to będzie indekser ostatecznie prowadzić do podjęcia decyzji o wypowiedzeniu pętli?

Jeśli masz pewność, że jesteś indekser ostatecznie spowodować stan zjazd ma być osiągnięty, wtedy to wszystko powinno być zainteresowani, a nie, czy użyć do lub chwilę.

Odpowiedział 03/11/2009 o 18:31
źródło użytkownik

głosy
0

Najprostszym sposobem na to byłoby nie przekształcić w pętli while, takie jak poniżej.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Odpowiedział 03/11/2009 o 18:33
źródło użytkownik

głosy
2

Wydaje mi się, że może to być łatwiejsze i bardziej czytelne , aby przekształcić go:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

i oddzielić w ten sposób przerwanie pętli ze zmiennej zwiększania wartości.

Jeśli widzę pętlę z kontroli granicznej (np i < limit) bym raczej zakładać, że jest to zmienna, która jest modyfikowana w rozsądny sposób) (spójny sposób. Nie ma powodu, dlaczego nie można robić, co chcesz, ale ja skłaniać się bardziej czytelny i bardziej oczekiwanego zachowania.

Odpowiedział 03/11/2009 o 18:34
źródło użytkownik

głosy
0

Aby odpowiedzieć na pytanie, które chciałbym wybrać kod; I wybrać dłuższą kod. Jej o wiele łatwiejsze do odczytania pierwszego (dłuższe) pętlę. I tak można odczytać drugi, ale nawet jeśli masz dużo doświadczenia trzeba spojrzeć dwa razy, aby wiedzieć, co to pętla. Plus kompilator zoptymalizuje kod wystarczająco dobrze.

Odpowiedział 03/11/2009 o 18:35
źródło użytkownik

głosy
1

Po co męczyć się z głupich pętli, kiedy można zrobić to samo (i wiele więcej!) Z uber-potężny goto?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

Jeśli jesteś jednym z tych słabeuszy programistów, które zmniejszają goto, to można spróbować z tym:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Odpowiedział 03/11/2009 o 18:38
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more