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

C: Πόσο κάνει...


gon1332

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

Δημοσ.

Το αποτέλεσμα που βγαίνει μετά την εκτέλεση του παρακάτω κώδικα στον gcc compiler είναι 4 για το i:

>
i = 0;
i = (++i) + (++i);

 

Εγώ κάνοντας το με το μυαλό κάπου "σκαλώνω" και το βγάζω 3.

 

Σας παραθέτω την σκέψη μου:

Πρώτα εκτελούνται οι παρενθέσεις, άρα με το πρώτο ++i το i έχουμε πρώτα εκτέλεση της πράξης και μετά εκχώρηση του αποτελέσματος στο i. Οπότε και i==1. Με το δεύτερο ++i έχουμε τα ίδια, συνεπώς( δεδομένου ότι το i έχει τιμή 1 από πριν) to i γίνεται 2.

Στη συνέχεια μένει η ανάθεση i = 1 + 2 που κάνει 3.

 

Κάπου κολλάω μετά το πρώτο (++i). :confused:

 

Θα το έτρεχα με gdb αλλά δεν έχω προλάβει να εγκαταστήσω linux μετά το format.

Δημοσ.

Το τρικ είναι στην θέση του ++ δηλαδή καθώς πρόκειται για ++i (δηλαδή για preincrement) και όχι για i++ (δηλαδή για postincrement) τότε αυτό που συμβαίνει είναι να υπολογισθεί το ++i πριν το τελικό ενδιάμεσο + άρα, ένα ++i που μας πάει το i στο 1 και ένα ακόμη ++i που μας πάει το i στο 2 και ένα ενδιάμεσο + που υπολογίζεται τελευταίο ως i + i από τον compiler (καθώς έχει ήδη υπολογίσει τα postincrement ++i μας και το i είναι πια 2), μας κάνει 4.

Δημοσ.

Το αποτέλεσμα που βγαίνει μετά την εκτέλεση του παρακάτω κώδικα στον gcc compiler είναι 4 για το i:

>
i = 0;
i = (++i) + (++i);

 

Εγώ κάνοντας το με το μυαλό κάπου "σκαλώνω" και το βγάζω 3.

 

Σας παραθέτω την σκέψη μου:

Πρώτα εκτελούνται οι παρενθέσεις, άρα με το πρώτο ++i το i έχουμε πρώτα εκτέλεση της πράξης και μετά εκχώρηση του αποτελέσματος στο i. Οπότε και i==1. Με το δεύτερο ++i έχουμε τα ίδια, συνεπώς( δεδομένου ότι το i έχει τιμή 1 από πριν) to i γίνεται 2.

Στη συνέχεια μένει η ανάθεση i = 1 + 2 που κάνει 3.

 

Κάπου κολλάω μετά το πρώτο (++i). :confused:

 

Θα το έτρεχα με gdb αλλά δεν έχω προλάβει να εγκαταστήσω linux μετά το format.

 

 

1) i = (++i) + (++i); i= 1

2) i = (++i) + (++i); i =2

3) i = (++i) + (++i); i = 2 + 2 = 4

 

 

Δημοσ.

Μάλλον θα είναι άσκηση σε κάποιο βιβλίο αυτό, ε;

 

Στην πράξη απόφευγε τέτοια πράγματα! Επίσης απόφευγε τουλαχιστον στην αρχή να αυξομειώνεις προθεματικά τις μεταβλητές σου (--i, ++i) και να προτιμάς να τις αυξομειώνεις μεταθεματικά (i++, i--)... αυτή η πρακτική μπορεί να σε γλιτώσει από πολλούς... πονοκεφάλους ;)

 

Προθεματικά χρησιμοποίησε μονάχα αν είσαι ΑΠΟΛΥΤΑ σίγουρος ότι ξέρεις γιατί το κάνεις.

Δημοσ.

Βασικά είναι στις διαλέξεις του μαθήματος C

http://inf-server.inf.uth.gr/courses/CE120/lectures/4-Ops.pdf

στη σελίδα 10 όπου μας επισημαίνει ο καθηγητής που να δώσουμε

μεγάλη προσοχή. Και όντως μας πρότεινε να μην τα χρησιμοποιούμε

με τέτοιον τρόπο, αλλά τώρα ρίχνοντας μια ματιά μου "καρφώθηκε".

 

Όσον αφορά τα preincrements μου φαίνονται σωτήρια και χρήσιμα

πολλές φορές, απλώς καλό είναι να αποφεύγεται ο παραπάνω τρόπος

χρήσης τους.

 

Όπως και να 'χει ευχαριστώ. :-)

Δημοσ.

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

Να φανταστώ ότι το κάνεις από αγάπη και όχι ξέρω γω επειδή το χρωστάς...ε?

Δημοσ.

Βασικά είναι στις διαλέξεις του μαθήματος C

http://inf-server.inf.uth.gr/courses/CE120/lectures/4-Ops.pdf

στη σελίδα 10 όπου μας επισημαίνει ο καθηγητής που να δώσουμε

μεγάλη προσοχή. Και όντως μας πρότεινε να μην τα χρησιμοποιούμε

με τέτοιον τρόπο, αλλά τώρα ρίχνοντας μια ματιά μου "καρφώθηκε".

 

Όσον αφορά τα preincrements μου φαίνονται σωτήρια και χρήσιμα

πολλές φορές, απλώς καλό είναι να αποφεύγεται ο παραπάνω τρόπος

χρήσης τους.

 

Όπως και να 'χει ευχαριστώ. :-)

 

Όπως είπε και ο migf1 καλό είναι να μην χρησιμοποιείται κάτι τέτοιο. Καλά κάνει και ο καθηγητής και εφιστά την προσοχή γιατί μπορεί σε άλλον compiler (ή ακόμη και σε άλλη έκδοση του ίδιου compiler όπως βλέπεις στα παραδείγματα) να έχει διαφορετική συμπεριφορά. Μπορεί αντί για 4 να δώσει 3 ή να βγει ένας δράκος και να σου δαγκώσει το χέρι. Αν δεις εδώ, πολλές ερωτήσεις (όπως οι 3.2,3.8,3.9) εξηγούν τι είναι τα sequence points και τι γίνεται με τέτοιους κώδικες.

Αρχειοθετημένο

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

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