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

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

  • Απαντ. 57
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

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

 

Το όλο παιχνίδι εδώ ήταν τα 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 και βου α λα.

Δημοσ.

Ποια φωτα μου; Η 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);

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...