Vkt678 Δημοσ. 14 Ιανουαρίου 2015 Δημοσ. 14 Ιανουαρίου 2015 Καλησπέρα.Καθώς διάβαζα για την εξεταστική εμφανίστηκε αυτό το παράδειγμα στο οποίο δεν μπορώ να καταλάβω πως λειτουργεί η εντολή ++p->word.Πιο συγκεκριμένα: int main(void) { int i, n; struct worddata { char *word; int numb; char let; } wordarray[] = { {"ABCD", 1, ’a’}, {"EF", 2, ’b’}, {"GHIJ", 3, ’c’}, {"KL", 4, ’d’}, {"M", 5, ’e’}}; struct worddata *p = wordarray; n = sizeof(wordarray)/sizeof(struct worddata); printf("%d ", n); for (i=0 ; i < 2 ; i++) { printf("%c ", *p->word++); printf("%s ", ++p->word); printf("%c ", p->let++); printf("%c ", (++p)->let); printf("%d ", p++->numb); printf("%d ", ++p->numb); } for (i=0 ; i < n ; i++) printf("%s %d %c ", wordarray[i].word, wordarray[i].numb, wordarray[i].let); printf("\n"); return 0; } Η απάντηση στο ερώτημα τι θα εκτυπωθεί από το πρόγραμμα αυτό είναι : 5 A CD a b 2 4 G IJ c d 4 6 CD 1 b EF 2 b IJ 4 d KL 4 d M 6 e Μπορεί κάποιος να μου εξηγήσει αρχικά πως προκύπτει το CD?
migf1 Δημοσ. 14 Ιανουαρίου 2015 Δημοσ. 14 Ιανουαρίου 2015 Αν θέλεις να ασχοληθεί κανείς, σου προτείνω να στοιχίσεις όμορφα τον κώδικά σου και να τον περικλείσεις σε code tags εδώ στο φόρουμ. Το CD προκύπτει επειδή η 2η printf() μέσα στο 1ο for-loop κάνει skip το B (λόγω του ++) και τυπώνει το υπόλοιπο ως c-string (λόγω του %s), ενώ η 1η printf() έχει ήδη τυπώσει το A (λόγω του %c) και έχει πάει τον δείκτη στο B (λόγω του ++)... όλα αυτά αναφέρονται στο c-string "ABCD" (στην 1η δομή του πίνακά σου). ΥΓ. Όποιος σας έβαλε αυτή το.. πράγμα ως παράδειγμα, μπορείς να του πεις χαιρετίσματα από μένα καθώς και να αλλάξει επάγγελμα 1
albNik Δημοσ. 14 Ιανουαρίου 2015 Δημοσ. 14 Ιανουαρίου 2015 Μια χαρα ασκηση ειναι για να εξασκηθείς στα pre-post increment σε συνδυασμο με pointer to structure, to char και operator precedence.
Vkt678 Δημοσ. 14 Ιανουαρίου 2015 Μέλος Δημοσ. 14 Ιανουαρίου 2015 Δηλαδή αν κατάλαβα καλά,η εντολή ++p->word,που ουσιαστικά ισοδυναμεί με ++(p->word),σημαίνει ότι επειδή ο τελεστής ++ είναι προθεματικός τότε θα γίνει πρώτα η αύξηση του δείκτη και στη συνέχεια λόγω του %s τυπώνει από το σημείο που δείχνει ο τωρινός δείκτης.Εγώ νόμιζα ότι απλά θα τυπώσει μόνο αυτό που δείχνει ο τωρινός δείκτης,όχι και το υπόλοιπο κομμάτι..thanks
migf1 Δημοσ. 14 Ιανουαρίου 2015 Δημοσ. 14 Ιανουαρίου 2015 ...Εγώ νόμιζα ότι απλά θα τυπώσει μόνο αυτό που δείχνει ο τωρινός δείκτης,όχι και το υπόλοιπο κομμάτι..thanks Παρακαλώ Το πως θα εκλάβει η printf() αυτό που έπεται, το καθορίζει ο format-specifier που της έχεις βάλει στο format-string. Όταν της βάζεις %c της λες πως ότι έπεται θέλω να μου το τυπώσεις ως char. Όταν της βάζεις %s της λες πως ότι έπεται θέλω να μου το τυπώσεις ως string. Και μιας στην C τα strings είναι NUL terminated, σου τυπώνει ότι υπάρχει από το τρέχον σημείο και μετά, μέχρι να βρει τον NUL χαρακτήρα (δηλαδή τον '\0', δηλαδή ένα μηδενικό byte). @albnik: Το "μια χαρά" είναι σχετικό. Για μένα ο συγκεκριμένος κώδικας εκτός του ότι δεν έχει απολύτως καμία σχέση με real-life example, αποτελεί... απαύγασμα κακής πρακτικής και ασυνέπειας (coding inconsistency).
albNik Δημοσ. 14 Ιανουαρίου 2015 Δημοσ. 14 Ιανουαρίου 2015 @mig Η άσκηση ζηταει από τους φοιτητες την κατανοηση των εκφρασεων a->b++, (++*a)->b, a++->b ...κλπ στην C. Το αν εχει δωσει περιγραφικα ονοματα στης μεταβλητές, εχει βαλει σωστα comments, αν a,b ειναι μηλα η μανταρινια σε real life, αν απελευθερωνει τη μνημη δεν εχει σημασια στο συγκεκριμένο. Δεν ειναι μαθημα για algorithms, software design ή best practices.
migf1 Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 Ίσως δεν κατάλαβες τι έγραψα. Το code-consistency δεν έχει καμία σχέση με αυτά που λες. Έχει να κάνει με το να προσπαθείς στο μέτρο του δυνατού ας πούμε να κάνεις παντού post (ή παντού pre) increment, να κάνεις παντού (ή να μην κάνεις παντού) dictate το precedence με παρενθέσεις, κλπ.
albNik Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 Ο καθηγητής επίτηδες εβαλε διαφορετικούς συνδυασμους pre/post, αυξηση δεικτη/αυξηση member, με/χωρις παρανθεσεις. Εννοειται δεν θα τα χρησιμοποιει καποιος ολα ταυτοχρονα στην ιδια συνάρτηση ή ιδιο κομματι κωδικα
migf1 Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 Το ξέρω ρε συ Νίκο πως το έχει κάνει επίτηδες. Η μεγάλη μου ένσταση είναι πως για να τους μάθει ένα "καλό" τους εκθέτει (εννοώ τους κάνει expose) σε 10 "κακά".
παπι Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 Μια χαρα ασκηση ειναι για να εξασκηθείς στα pre-post increment σε συνδυασμο με pointer to structure, to char και operator precedence. Βλακεια ειναι. Υπεραναλυση απλων πραγματων λες και δεν υπαρχουν πραματα να κανουν.
Vkt678 Δημοσ. 2 Φεβρουαρίου 2015 Μέλος Δημοσ. 2 Φεβρουαρίου 2015 Ρε παιδιά ξαναδιαβάζοντας το παράδειγμα κόλλησα στην εντολή p++->numb.Για ποιο λόγο εκτυπώνει το 2 αφού ο τελεστής αύξησης είναι μεταθεματικός?
imitheos Δημοσ. 2 Φεβρουαρίου 2015 Δημοσ. 2 Φεβρουαρίου 2015 Ρε παιδιά ξαναδιαβάζοντας το παράδειγμα κόλλησα στην εντολή p++->numb.Για ποιο λόγο εκτυπώνει το 2 αφού ο τελεστής αύξησης είναι μεταθεματικός? struct worddata { char *word; int numb; char let; } wordarray[] = { {"ABCD", 1, ’a’}, {"EF", 2, ’b’}, {"GHIJ", 3, ’c’}, {"KL", 4, ’d’}, {"M", 5, ’e’}}; struct worddata *p = wordarray; for (i=0 ; i < 2 ; i++) { printf("%c ", *p->word++); printf("%s ", ++p->word); printf("%c ", p->let++); printf("%c ", (++p)->let); printf("%d ", p++->numb); printf("%d ", ++p->numb); } Η έξοδος που παίρνω είναι "A CD a b 2 4". Υποθέτω πως αυτό το 2 εννοείς, έτσι ? Δεν ξέρω τι θα πει μεταθεματικός αλλά τι δεν καταλαβαίνεις ? * Η έκφραση (++p)->let έχει παρένθεση οπότε ο τελεστής αύξησης επιβάλλεται στον δείκτη έτσι ο p δείχνει τώρα στο δεύτερο στοιχείο του πίνακα (το "EF", 2, 'b') του οποίου το μέλος let έχει τιμή 'b' και τυπώνεται b. * Ερχόμαστε τώρα στην έκφραση που έχεις πρόβλημα. Στην p++->numb έχουμε τον τελεστή postfix και το -> που έχουν την ίδια προτεραιότητα και σειρά από αριστερά προς τα δεξιά οπότε κερδίζει το ++ και επιβάλλεται στον δείκτη. Έτσι ο δείκτης p αυξάνεται κατά 1 και δείχνει πλέον στο 3ο στοιχείο (το "GHIJ", 3, 'c'). Επειδή όμως ο τελεστής είναι postfix, η έκφραση μας θα έχει την τιμή πριν την αύξηση άρα θα εμφανιστεί το μέλος numb του ("EF", 2, 'b') που είναι το 2.
Vkt678 Δημοσ. 2 Φεβρουαρίου 2015 Μέλος Δημοσ. 2 Φεβρουαρίου 2015 Ευχαριστώ με βοήθησες πάρα πολύ!Κατάλαβα πλήρως πως δουλεύει
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα