Δημοσιεύτηκε: 24 Μαρ 2012, 16:00
@Starlight:
Σωστά τα γράφεις για το infinite loop. Το σκέτο ερωτηματικό είναι απλώς ένα κενό statement (δεν το χρειάζεσαι).
Τώρα, σε ότι αφορά τη χρήση της goto, είναι καλό να μην μάθεις καν πως χρησιμοποιείται ως εναλλακτική υλοποίηση ενός loop (διότι περί αυτού πρόκειται στο κώδικα που παρέθεσες)... όταν θες να υλοποιήσεις loop να το υλοποιείς με for, while ή do.
Η μόνη θεμιτή (και κυρίως ευανάγνωστη κι απροβλημάτιστη) χρήση της goto είναι όταν χρησιμοποιείται περίπου σαν υποσυνάρτηση μέσα σε συνάρτηση, τοποθετημένη στο τέλος της συνάρτησης.
Αν π.χ. έχεις μια bool συνάρτηση η οποία μπορεί να παράξει σφάλμα σε 5 διαφορετικές περιπτώσεις, και σε κάθε σφάλμα πρέπει να γίνει κάποιου είδους cleanup πριν επιστρέψει το σφάλμα η συνάρτηση, τότε αντί να γράφεις τον cleanup κώδικα μέσα στο if της κάθε μιας από τις 5 περιπτώσεις (+ return false) , τον γράφεις μια φορά στο τέλος της συνάρτησης (+return false), και μέσα στα if της κάθε περίπτωσης γράφεις: goto clean_and_ret.
Σωστά τα γράφεις για το infinite loop. Το σκέτο ερωτηματικό είναι απλώς ένα κενό statement (δεν το χρειάζεσαι).
Τώρα, σε ότι αφορά τη χρήση της goto, είναι καλό να μην μάθεις καν πως χρησιμοποιείται ως εναλλακτική υλοποίηση ενός loop (διότι περί αυτού πρόκειται στο κώδικα που παρέθεσες)... όταν θες να υλοποιήσεις loop να το υλοποιείς με for, while ή do.
Η μόνη θεμιτή (και κυρίως ευανάγνωστη κι απροβλημάτιστη) χρήση της goto είναι όταν χρησιμοποιείται περίπου σαν υποσυνάρτηση μέσα σε συνάρτηση, τοποθετημένη στο τέλος της συνάρτησης.
Αν π.χ. έχεις μια bool συνάρτηση η οποία μπορεί να παράξει σφάλμα σε 5 διαφορετικές περιπτώσεις, και σε κάθε σφάλμα πρέπει να γίνει κάποιου είδους cleanup πριν επιστρέψει το σφάλμα η συνάρτηση, τότε αντί να γράφεις τον cleanup κώδικα μέσα στο if της κάθε μιας από τις 5 περιπτώσεις (+ return false) , τον γράφεις μια φορά στο τέλος της συνάρτησης (+return false), και μέσα στα if της κάθε περίπτωσης γράφεις: goto clean_and_ret.
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
bool foo()
{
if ( err1)
goto clean_and_ret;
if ( err2 )
goto clean_and_ret;
if ( err3 )
goto clean_and_ret;
if ( err4 )
goto clean_and_ret;
if ( err5 )
goto clean_and_ret;
/* όλα είναι ok, νορμάλ κώδικας της συνάρτησης */
return true;
clean_and_ret:
/* εδώ ο cleanup κώδικας */
return false;
}