Care este modul corect de a converti de la o buclă la o buclă în timp ce?

voturi
1

Am o buclă de forma:

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

Și vreau să - l transforme într - o buclă în timp ce (mai ales pentru că vreau să se joace cu valoarea din iinteriorul buclei pentru a merge înapoi și înainte și mi co-lucrător crede că a face acest lucru într - o buclă este predispus la probleme. Am tendința de a sunt de acord cu el). Așa că am scris ceva de genul:

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

Ceea ce a determinat unele unele comentarii zgomotoase. Raționamentul meu este că nu știu ce codul din interiorul buclei nu - poate (și nu) au mai multe continuecomenzi.

Ca răspuns el a scris acest lucru:

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

A acordat mai puțin liniile sale, dar eu încă mai cred că codul meu este mult mai elegant - ce crezi?

Întrebat 03/11/2009 la 18:26
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
3

Și vreau să-l transforme într-o buclă în timp ce (mai ales pentru că vreau să se joace cu valoarea i în interiorul buclei pentru a merge înapoi și înainte și mi co-lucrător crede că a face acest lucru într-o buclă este predispus la probleme. Am tendința să fie de acord cu el).

Acest lucru este perfect acceptabil în cele mai multe limbi. Nu există nici un motiv pentru a evita o buclă.

Publicat 03/11/2009 la 18:30
sursa de către utilizator

voturi
5

Redarea cu valoarea indicelui în timp ce într - o structură de buclare este predispus la probleme, indiferent de structura looping este .

Nu va conta dacă este o buclă sau o buclă în timp ce, punctul este va indexatorul în cele din urmă să vă conducă la a lua o decizie de reziliere bucla?

Dacă sunteți sigur că sunteți indexor va provoca în cele din urmă starea de ieșire să fie atins, atunci este tot ceea ce ar trebui să fie preocupat, să nu fie de a utiliza un timp sau un timp.

Publicat 03/11/2009 la 18:31
sursa de către utilizator

voturi
0

Cel mai simplu mod de a face acest lucru ar fi să nu se transforme într-o buclă în timp, cum ar fi de mai jos.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Publicat 03/11/2009 la 18:33
sursa de către utilizator

voturi
2

Mi se pare că poate fi mai ușor și mai ușor de citit pentru al converti la:

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

și, astfel, se separă terminarea buclei de incrementarea variabilă.

Dacă văd o buclă cu o verificare de limită ( de exemplu i < limit) , aș tinde să se presupună că există o variabilă care este modificată într - un (rezonabil) mod coerent. Nu există nici un motiv pentru care nu se poate face ceea ce vrei, dar mi - ar inclina spre un comportament mai ușor de citit și mai mult de așteptat.

Publicat 03/11/2009 la 18:34
sursa de către utilizator

voturi
0

Pentru a răspunde la întrebarea cu privire la care codul aș alege; Am alege codul de mai mult timp. Este mult mai ușor de citit prima bucla (mai mult). Și da, eu pot citi de-al doilea, dar chiar dacă aveți o mulțime de experiență trebuie să se uite de două ori să știe ce face asta bucla. Plus compilatorul va optimiza codul suficient de bine.

Publicat 03/11/2009 la 18:35
sursa de către utilizator

voturi
1

De ce deranjez cu bucle stupide , atunci când se poate face același lucru (și mult mai mult!) Cu uber-puternic goto?

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

Dacă sunteți unul dintre acei programatori cu inima slabe care diminuează goto, atunci puteți încerca cu acest lucru:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Publicat 03/11/2009 la 18:38
sursa de către utilizator

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