gon1332 Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Το αποτέλεσμα που βγαίνει μετά την εκτέλεση του παρακάτω κώδικα στον 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). Θα το έτρεχα με gdb αλλά δεν έχω προλάβει να εγκαταστήσω linux μετά το format.
Directx Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Το τρικ είναι στην θέση του ++ δηλαδή καθώς πρόκειται για ++i (δηλαδή για preincrement) και όχι για i++ (δηλαδή για postincrement) τότε αυτό που συμβαίνει είναι να υπολογισθεί το ++i πριν το τελικό ενδιάμεσο + άρα, ένα ++i που μας πάει το i στο 1 και ένα ακόμη ++i που μας πάει το i στο 2 και ένα ενδιάμεσο + που υπολογίζεται τελευταίο ως i + i από τον compiler (καθώς έχει ήδη υπολογίσει τα postincrement ++i μας και το i είναι πια 2), μας κάνει 4.
παπι Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Το αποτέλεσμα που βγαίνει μετά την εκτέλεση του παρακάτω κώδικα στον 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). Θα το έτρεχα με gdb αλλά δεν έχω προλάβει να εγκαταστήσω linux μετά το format. 1) i = (++i) + (++i); i= 1 2) i = (++i) + (++i); i =2 3) i = (++i) + (++i); i = 2 + 2 = 4
gon1332 Δημοσ. 16 Αυγούστου 2011 Μέλος Δημοσ. 16 Αυγούστου 2011 Ok! Το κατάλαβα. Κόλλησα σε ανόητο σημείο. Ευχαριστώ πολύ!!
migf1 Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Μάλλον θα είναι άσκηση σε κάποιο βιβλίο αυτό, ε; Στην πράξη απόφευγε τέτοια πράγματα! Επίσης απόφευγε τουλαχιστον στην αρχή να αυξομειώνεις προθεματικά τις μεταβλητές σου (--i, ++i) και να προτιμάς να τις αυξομειώνεις μεταθεματικά (i++, i--)... αυτή η πρακτική μπορεί να σε γλιτώσει από πολλούς... πονοκεφάλους Προθεματικά χρησιμοποίησε μονάχα αν είσαι ΑΠΟΛΥΤΑ σίγουρος ότι ξέρεις γιατί το κάνεις.
gon1332 Δημοσ. 16 Αυγούστου 2011 Μέλος Δημοσ. 16 Αυγούστου 2011 Βασικά είναι στις διαλέξεις του μαθήματος C http://inf-server.inf.uth.gr/courses/CE120/lectures/4-Ops.pdf στη σελίδα 10 όπου μας επισημαίνει ο καθηγητής που να δώσουμε μεγάλη προσοχή. Και όντως μας πρότεινε να μην τα χρησιμοποιούμε με τέτοιον τρόπο, αλλά τώρα ρίχνοντας μια ματιά μου "καρφώθηκε". Όσον αφορά τα preincrements μου φαίνονται σωτήρια και χρήσιμα πολλές φορές, απλώς καλό είναι να αποφεύγεται ο παραπάνω τρόπος χρήσης τους. Όπως και να 'χει ευχαριστώ.
Adawn Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Εύγε παιδί μου που ασχολείσαι με τα μαθήματα Αύγουστο μήνα , μετά λένε οτι οι Έλληνες μόνο καταλήψεις ξέρουν ... Να φανταστώ ότι το κάνεις από αγάπη και όχι ξέρω γω επειδή το χρωστάς...ε?
gon1332 Δημοσ. 16 Αυγούστου 2011 Μέλος Δημοσ. 16 Αυγούστου 2011 Εννοείται από αγάπη!!! Ο προγραμματισμός είναι κλειδί για το μέλλον μου. ;-)
imitheos Δημοσ. 16 Αυγούστου 2011 Δημοσ. 16 Αυγούστου 2011 Βασικά είναι στις διαλέξεις του μαθήματος 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 και τι γίνεται με τέτοιους κώδικες.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.