Προς το περιεχόμενο

Εχω κολλησει σε μια ασκηση της C


BloodDonor89

Προτεινόμενες αναρτήσεις

Λεπτομέρειες..

 

Το όλο παιχνίδι εδώ ήταν τα 3 - 4 λεπτά για να σκεφτεί κανείς για κάτι τόσο trivial μία λύση που να είναι μάγκικη με χρήση των ιδιοτήτων των επαναληπτικών δομών. 

 

Και τα snippets σου ήταν αρκετά ωραία!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

float prod = 1.f;
int   i = 10;
while (prod *= i, i-- != 1);
printf( "%.15f\n", 1.f/prod );
EDIT: http://www.insomnia.gr/topic/515793-εχω-κολλησει-σε-μια-ασκηση-της-c/page-2#entry52939719

 

 

Σε αυτό το παράδειγμα, πρώτη φορά βλέπω την while να χρησιμοποιείται έτσι. Νόμιζα ότι μπορούσε να λάβει μόνο ένα statement. Πως δουλεύει το "," σε αυτή την περίπτωση;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Σε αυτό το παράδειγμα, πρώτη φορά βλέπω την while να χρησιμοποιείται έτσι. Νόμιζα ότι μπορούσε να λάβει μόνο ένα statement. Πως δουλεύει το "," σε αυτή την περίπτωση;

 

Σαν AND.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διάβασα το wiki και αν το κατάλαβα καλά (κυρίως εδώ), πρέπει να δουλεύει όπως χρησιμοποιείται το κόμμα στο παράδειγμα του wiki με την if:

if (y = f(x), y > x) {
    ... // statements involving x and y
} 

Εδώ το prod δουλεύει σα βοηθητική μεταβλητή για να περάσουμε στο κυρίως μέρος το οποίο βρίσκεται μετά το comma seperator.

while (prod *= i, i-- != 1);

Ας με διορθώσει κάποιος αν δεν κατάλαβα καλά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δουλεύει ακριβώς όπως ο τελεστής &&; Δηλαδή αν αποτύχει η πρώτη σύγκριση πριν το κόμμα η δεύτερη έκφραση θα υπολογιστεί ή όχι;

καμια σχεση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ποια φωτα μου; Η while δεν εχει καποια "σπεσιαλ" συνταξη με ,

 

αρα; Αρα ψαχνουμε το τι κανει ο comma operator και βου α λα.

 

Άρα εκτελούνται με τη σειρά; Όπως και οι αρχικοποιήσεις σε ένα for loop;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χμ, για να είμαι ειλικρινής δεν το περίμενα πως θα δημιουργούσε τόσες απορίες ο τελεστής ,

 

Αυτό που κάνει στο συγκεκριμένο σνίπετ είναι να υπολογίζει το εκάστοτε επιμέρους prod σε κάθε επανάληψη, χωρίς να επηρεάζει το boolean evaluation της συνθήκης του βρόχου.

 

H τιμή του υπολογισμού, δηλαδή η τιμή του εκάστοτε επιμέρους prod, θα συμμετείχε ως boolean στη συνθήκη του βρόχου μόνο αν ο υπολογισμός ήταν ο τελευταίος όρος του τελεστή ,

 

Γενικώς, οι όροι του τελεστή , υπολογίζονται πάντα κανονικά αλλά ως boolean αξιολογείται μονάχα η τιμή του τελευταίου όρου (ή αν φύγουμε από τη λογική της συνθήκης, όλοι οι όροι υπολογίζονται αλλά ως τελική τιμή δίνεται πάντα ο υπολογισμός του τελευταίου όρου).

 

ΥΓ. Ελπίζω να μη σας μπέρδεψα χειρότερα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

while (prod *= i, i-- != 1);

Αν δεν κάνω λάθος το παραπάνω κάνει το εξής με τη σειρά:

 

1. υπολογίζει το prod*=1

2. υπολογίζει το i-- και το συγκρίνει με το 1

3. επιστρέφει τη τιμή της σύγκρισης για να δει αν θα συνεχίσει το loop.

 

Κάπως αλλιώς θα γραφόταν έτσι:

do {

  prod *= i;
 
} while(i-- != 1);
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...