Hva er den riktige måten å konvertere fra en for loop til en stund loop?

stemmer
1

Jeg har en for løkke av formen:

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

Og jeg ønsker å konvertere den til en stund loop (mest fordi jeg ønsker å spille med verdien av iinne i loopen til å gå frem og tilbake og min kollega mener at å gjøre dette i en for loop er utsatt for problemer. Jeg har en tendens til å enig med ham). Så jeg skrev noe sånt som dette:

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

Som blir bedt om noen noen høyt kommentarer. Mitt resonnement er at du ikke vet hva koden inne i løkken gjør - det kan (og gjør) har flere continuekommandoer.

Som svar skrev han dette:

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

Innvilget sine mindre linjer, men jeg tror fremdeles min kode er mer elegant - hva tror du?

Publisert på 03/11/2009 klokken 17:26
kilden bruker
På andre språk...                            


6 svar

stemmer
3

Og jeg ønsker å konvertere den til en stund loop (mest fordi jeg ønsker å spille med verdien av jeg inne i loopen til å gå frem og tilbake og min kollega mener at å gjøre dette i en for loop er utsatt for problemer. Jeg pleier å være enig med ham).

Dette er helt akseptabelt i de fleste språk. Det er ingen grunn til å unngå en for loop.

Svarte 03/11/2009 kl. 17:30
kilden bruker

stemmer
5

Spille med verdien av indeksen, mens i en looping struktur er utsatt for problemer, uansett hva looping strukturen er .

Det kommer ikke til å spille noen rolle om det er en for løkke eller en stund loop, er det punktet vil indekser til slutt lede deg til å ta en beslutning av sløyfe oppsigelse?

Hvis du er sikker på at du er indekser vil til slutt føre til at exit tilstand skal oppnås, da det er alt du bør være opptatt av, ikke om å bruke et for eller en stund.

Svarte 03/11/2009 kl. 17:31
kilden bruker

stemmer
0

Den enkleste måten å gjøre dette ville være å ikke konvertere til en stund loop, slik som under.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Svarte 03/11/2009 kl. 17:33
kilden bruker

stemmer
2

Det virker for meg at det kan være lettere og mer lesbar å konvertere den til:

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

og således skille avslutning av løkken fra den variable inkrementering.

Hvis jeg ser en sløyfe med en grense sjekk (f.eks i < limit) Jeg ville tendens til å anta at det er en variabel som blir endret i en (rimelig) konsekvent måte. Det er ingen grunn til at du ikke kan gjøre hva du vil, men jeg ville helle mot mer lesbar og mer forventet atferd.

Svarte 03/11/2009 kl. 17:34
kilden bruker

stemmer
0

For å svare på spørsmålet om hvilken kode jeg ville velge; Jeg velger å vise mer kode. Dens mye lettere å lese den første (lenger) loop. Og ja jeg kan lese andre, men selv om du har mye erfaring du har til å se to ganger for å vite hva som sløyfe gjør. Pluss kompilatoren vil optimalisere koden godt nok.

Svarte 03/11/2009 kl. 17:35
kilden bruker

stemmer
1

Hvorfor bry seg med dumme løkker når du kan gjøre det samme (og mye mer!) Med den uber-kraftig goto?

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

Hvis du er en av de sarte sjeler programmerere som reduserer den goto, så kan du prøve med denne:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Svarte 03/11/2009 kl. 17:38
kilden bruker

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