Wat is de juiste manier om te zetten van een lus op een lus while?

stemmen
1

Ik heb een lus in de vorm:

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

En ik wil het om te zetten in een tijdje lus (vooral omdat ik wil spelen met de waarde van de iin de loop te gaan heen en weer en mijn medewerker denkt dat dit te doen in een lus is gevoelig voor problemen. Ik heb de neiging om met hem eens). Dus schreef ik zoiets als dit:

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

Naar aanleiding waarvan sommige een aantal luide opmerkingen. Mijn redenering is dat je niet weet wat de code in de lus doet - het kan (en doet) hebben meerdere continueopdrachten.

Als reactie schreef hij het volgende:

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

Toegegeven zijn minder lijnen, maar ik denk nog steeds dat mijn code is meer elegant - wat denk je?

De vraag is gesteld op 03/11/2009 om 18:26
bron van user
In andere talen...                            


6 antwoorden

stemmen
3

En ik wil het om te zetten in een tijdje lus (vooral omdat ik wil spelen met de waarde van i in de lus naar voren en naar achteren en mijn medewerker denkt dat dit te doen in een lus is gevoelig voor problemen gaan. Ik heb de neiging met hem eens).

Dit is in de meeste talen perfect aanvaardbaar. Er is geen reden om te voorkomen dat een lus.

antwoordde op 03/11/2009 om 18:30
bron van user

stemmen
5

Spelen met de waarde van de index, terwijl in een looping structuur is gevoelig voor problemen, ongeacht wat de looping structuur .

Het gaat niet uit of het een lus of een tijdje loop, het punt is zal de indexer je uiteindelijk leiden tot een besluit van de lus beëindiging te maken?

Als u zeker weet dat je indexer zal uiteindelijk ertoe leiden dat uw exit conditie te bereiken bent, dan is dat alles moet je bezig met zijn, niet of er een te gebruiken voor of een tijdje.

antwoordde op 03/11/2009 om 18:31
bron van user

stemmen
0

De eenvoudigste manier om dit te doen zou zijn om niet om te zetten in een while loop, zoals hieronder.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
antwoordde op 03/11/2009 om 18:33
bron van user

stemmen
2

Het lijkt mij dat het eenvoudiger en kan beter leesbaar te converteren naar:

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

en dus scheiden de beëindiging van de lus van het variabele ophogen.

Als ik een lus zien die een begrenzingscontroleopdracht (bijvoorbeeld i < limit) zou ik trachten aan te nemen dat er een variabele die wordt in een (redelijk) consistente wijze wordt gemodificeerd. Er is geen reden waarom je niet kunt doen wat je wilt, maar ik zou neigen naar het leesbaarder en meer verwachte gedrag.

antwoordde op 03/11/2009 om 18:34
bron van user

stemmen
0

Op de vraag over welke code ik zou kiezen antwoorden; Ik kies je langer code. Het is veel gemakkelijker om de eerste (langer) lus te lezen. En ja ik kan de tweede lezen, maar zelfs als je veel ervaring moet je twee keer kijken om te weten wat dat lus doet. Plus de compiler zal de code goed genoeg te optimaliseren.

antwoordde op 03/11/2009 om 18:35
bron van user

stemmen
1

Waarom zou je met dwaze loops als u hetzelfde (en nog veel meer!) Met de uber-krachtige kan doen goto?

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

Als je een van die watjes programmeurs dat het afnemen goto, dan kunt u proberen met deze:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
antwoordde op 03/11/2009 om 18:38
bron van user

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