Ποιος είναι ο σωστός τρόπος για να μετατρέψετε από ένα για το βρόχο σε ένα βρόχο while;

ψήφοι
1

Έχω ένα για το βρόχο της μορφής:

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

Και θέλω να το μετατρέψετε σε ένα βρόχο, ενώ (ως επί το πλείστον, επειδή θέλω να παίξω με την αξία της iμέσα στο βρόχο για να πάει προς τα πίσω και προς τα εμπρός και ο συνάδελφός μου νομίζει ότι κάνει αυτό το ένα για το βρόχο είναι επιρρεπείς σε προβλήματα. Τείνω να συμφωνώ μαζί του). Έτσι έγραψα κάτι σαν αυτό:

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

Ποια ζητηθεί κάποια κάποια δυνατά σχόλια. Το σκεπτικό μου είναι ότι δεν ξέρετε τι κάνει ο κώδικας μέσα στο βρόχο - δεν μπορεί (και δεν) έχουν πολλαπλές continueεντολές.

Ως απάντηση έγραψε το εξής:

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

Σύμφωνοι λιγότερο γραμμές, αλλά εξακολουθώ να πιστεύω κωδικός μου είναι πιο κομψό - τι νομίζετε;

Δημοσιεύθηκε 03/11/2009 στις 18:26
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
3

Και θέλω να το μετατρέψετε σε ένα βρόχο while (κυρίως επειδή θέλω να παίξω με την αξία του i μέσα στο βρόχο για να πάει προς τα πίσω και προς τα εμπρός και ο συνάδελφός μου νομίζει ότι κάνει αυτό το ένα για το βρόχο είναι επιρρεπείς σε προβλήματα. Τείνω να συμφωνήσει μαζί του).

Αυτό είναι απολύτως αποδεκτό στις περισσότερες γλώσσες. Δεν υπάρχει κανένας λόγος για να αποφευχθεί ένα για το βρόχο.

Απαντήθηκε 03/11/2009 στις 18:30
πηγή χρήστη

ψήφοι
5

Παίζοντας με την τιμή του δείκτη σας, ενώ σε μια δομή επανάληψης είναι επιρρεπείς σε προβλήματα, δεν έχει σημασία ποια είναι η looping δομή .

Δεν πρόκειται να έχει σημασία αν είναι ένα for loop ή ένα βρόχο while, το θέμα είναι να το ευρετήριο τελικά να σας οδηγήσει να λάβει μια απόφαση τερματισμού βρόχου;

Αν είστε σίγουροι ότι είστε ευρετήριο θα προκαλέσει τελικά την κατάσταση εξόδου σας που πρέπει να επιτευχθούν, τότε αυτό είναι το μόνο που πρέπει να ασχολούνται με, δεν είναι αν πρέπει να χρησιμοποιήσετε ένα υπέρ ή ένα κατά.

Απαντήθηκε 03/11/2009 στις 18:31
πηγή χρήστη

ψήφοι
0

Ο ευκολότερος τρόπος για να γίνει αυτό θα ήταν να μην μετατραπεί σε ένα βρόχο while, όπως παρακάτω.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Απαντήθηκε 03/11/2009 στις 18:33
πηγή χρήστη

ψήφοι
2

Μου φαίνεται ότι μπορεί να είναι πιο εύκολη και πιο ευανάγνωστο για να το μετατρέψετε σε:

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

και έτσι διαχωρίζουν τον τερματισμό του βρόχου από τη μεταβλητή αυξήσεως.

Αν δω μια θηλιά με ένα όριο ελέγχου (π.χ. i < limit) θα έχουν την τάση να υποθέσουμε ότι υπάρχει μια μεταβλητή που έχει τροποποιηθεί με (λογικά) συνεπή τρόπο. Δεν υπάρχει κανένας λόγος για τον οποίο δεν μπορείτε να κάνετε ό, τι θέλετε, αλλά θα ήθελα να κλίνει προς την κατεύθυνση της πιο ευανάγνωστο και πιο αναμενόμενη συμπεριφορά.

Απαντήθηκε 03/11/2009 στις 18:34
πηγή χρήστη

ψήφοι
0

Για να απαντηθεί το ερώτημα σχετικά με το ποια κώδικα που θα επιλέξετε? Επιλέγω πλέον τον κωδικό σας. Του πολύ πιο εύκολο να διαβάσει το πρώτο (πλέον) βρόχο. Και ναι μπορώ να διαβάσω το δεύτερο, αλλά ακόμα κι αν έχετε μεγάλη εμπειρία θα πρέπει να εξετάσουμε δύο φορές για να ξέρετε τι κάνει αυτό βρόχου. Πλέον ο compiler θα βελτιστοποιήσουν τον κωδικό αρκετά καλά.

Απαντήθηκε 03/11/2009 στις 18:35
πηγή χρήστη

ψήφοι
1

Γιατί να ασχοληθείτε με ανόητο βρόχους, όταν μπορείτε να κάνετε το ίδιο (και πολλά άλλα!), Με την uber-ισχυρό goto;

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

Αν είστε ένας από εκείνους τους δειλό προγραμματιστές που μειώνουν το goto, στη συνέχεια, μπορείτε να δοκιμάσετε με αυτό:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Απαντήθηκε 03/11/2009 στις 18:38
πηγή χρήστη

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