pavlos1908 Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 Καλημέρα, σήμερα με ρώτησε ένας αυμφοιτητης μου μια απορία για το τι κάνει μια συνθήκη, και επειδή κι εγώ δεν είμαι σίγουρος για αυτό που του απάντησα και θέλω να δω τι κάνει όντως, αν μπορεί ας μας διαφωτισει καποιος με το παρακάτω: while((*s++=*t++)!='\0');
migf1 Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 Αντιγράφει το cstring t στο cstring s. Το s πρέπει να έχει χώρο για τουλάχιστον όσο είναι το μέγεθος του t. Επίσης, αν δεν βάλεις τον κώδικα μέσα σε function, στο τέλος του loop δεν θα έχεις πρόσβαση ούτε στο s ούτε στο t (γιατί οι δείκτες τους θα έχουν μετακινηθεί από τις αρχές και των δυο). 1
defacer Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 Υπόψιν ότι για την ερώτησή σου, έχει βέβαια τεράστια σημασία τι ακριβώς είναι το type των s και t και αυτή είναι μια πληροφορία που πρέπει να δώσεις. Άσχετα που στην προκειμένη είναι ψιλοπροφανές αν είσαι έμπειρος. 1
imitheos Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 Καλημέρα, σήμερα με ρώτησε ένας αυμφοιτητης μου μια απορία για το τι κάνει μια συνθήκη, και επειδή κι εγώ δεν είμαι σίγουρος για αυτό που του απάντησα και θέλω να δω τι κάνει όντως, αν μπορεί ας μας διαφωτισει καποιος με το παρακάτω: while((*s++=*t++)!='\0'); Αντιγράφει το ένα string στο άλλο, όπως είπαν και τα άλλα παιδιά. Το απαντούμε πολύ συχνά για αντιγραφές και είναι ιδιωματική μορφή του παρακάτω: while (*t != '\0') { *s = *t; s++; t++; }; *s = 0; Θα ακούσεις χιλιάδες φορές να λέει κάποιος "string" αλλά στην C δεν υπάρχει τύπος string. Αυτό που λέμε string είναι μια σειρά χαρακτήρων. Για να καταλάβει λοιπόν το σύστημα πού τελειώνει το "string" σου βάζει στο τέλος ένα συγκεκριμένο χαρακτήρα που είναι ο χαρακτήρας 0. Έτσι λοιπόν ο παραπάνω κώδικας θα τρέξει μέχρι το *t να έχει την τιμή \0 που σημαίνει δηλαδή ότι τελείωσε το string t. Μέχρι να γίνει αυτό τρέχει το σώμα του while που τι κάνει ? Αντιγράφει το *t δηλαδή τον τρέχοντα χαρακτήρα του t στην τρέχουσα θέση του s και έπειτα αυξάνει κατά ένα τα s, t ώστε στην επόμενη ανακύκλωση να αντιγράψει τον επόμενο χαρακτήρα. Ας έρθουμε τώρα στο δικό σου που όπως είπαμε είναι συντομογραφία που κάνει την ίδια δουλειά. while((*s++=*t++)!='\0'); Κάτι που είναι είναι εύκολο να σου διαφύγει και είναι σημαντικό είναι το ερωτηματικό στο τέλος. Αυτό σημαίνει ότι το σώμα του while είναι κενό. Το μόνο που μας μένει είναι η συνθήκη δηλαδή το (*s++=*t++)!='\0'. Και πάλι το while θα εκτελεστεί μέχρι το αποτέλεσμα της παρένθεσης να γίνει ίσο με τον χαρακτήρα 0. Ας έλθουμε στην έκφραση *t++. Οι postfix τελεστές (++, -- που βρίσκονται στο τέλος) έχουν μεγαλύτερη προτεραιότητα από τον * dereference τελεστή. Έτσι το ++ δρα στο t και όχι στο *t οπότε αυξάνει την διεύθυνση του t ώστε να δείχνει στον επόμενο χαρακτήρα. Επειδή όμως είναι postfix τελεστής πρώτα παίρνουμε την τιμή *t και μετά δρα. Έτσι το *t++ μας δίνει τον τρέχοντα χαρακτήρας και αυξάνει την θέση του t. Το ίδιο ακριβώς γίνεται και με την έκφραση *s++ μόνο που εδώ θέτουμε την τιμή που πήραμε από το t. Έτσι αντιγράφονται ένας-ένας όλοι οι χαρακτήρες. Που κολλάει το != '\0' τώρα. #include <stdio.h> int main(void) { int k, l; printf ("%d\n", k = l = 5); return 0; } Έξοδος: 5 Δες τον παραπάνω κώδικα. Κάτι που εκμεταλλευόμαστε συχνά χωρίς να το πολύ-σκεφτόμαστε είναι ότι όλες οι εκφράσεις στην C επιστρέφουν κάτι. Όταν λέμε "l = 5", θέτουμε μεν την τιμή 5 στην μεταβλητή l αλλά επίσης επιστρέφεται η τιμή 5. Αυτός μάλιστα είναι και ο λόγος που μπορούμε να θέτουμε πολλαπλές μεταβλητές όπως η παραπάνω έκφραση "k = l = 5". Το ίδιο έχουμε και στην συνθήκη του while. Η τιμή κάθε χαρακτήρα εκτός που τίθεται στην μεταβλητή s, επιστρέφεται κιόλας οπότε μπορεί να ελεγχθεί. Έτσι βάζοντας τον έλεγχο != '\0' ελέγχουμε πότε θα επιστραφεί ο χαρακτήρας 0 δηλαδή πότε θα τελειώσει το string. 2
migf1 Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 ... Θα ακούσεις χιλιάδες φορές να λέει κάποιος "string" αλλά στην C δεν υπάρχει τύπος string. Αυτό που λέμε string είναι μια σειρά χαρακτήρων. Για να καταλάβει λοιπόν το σύστημα πού τελειώνει το "string" σου βάζει στο τέλος ένα συγκεκριμένο χαρακτήρα που είναι ο χαρακτήρας 0. ... Να συμπληρώσω πως δεν υπάρχει τύπος string στη C, αλλά η ορολογία "string" υφίσταται και παραπέμπει σε nul-terminated array of chars (ή nul-terminated string). Δηλαδή αυτό που περιγράφεις. Σε άλλες γλώσσες, που έχουν ξεχωριστό τύπο string, τα nul-terminated strings αναφέρονται πολύ συχνά ως "c strings", "c-strings" ή "cstrings" (η Microsoft έχει και τύπο CString στο MFC, αλλά το C μπροστά μάλλον παραπέμπει σε Class και όχι στη γλώσσα C... νομίζω όλες οι MFC κλάσεις ξεκινάνε με C). Σε C context όμως δεν χρειάζεται τίποτα από αυτά. Λέμε "string" και ξέρουμε τι εννοούμε. @OP: Στο 1ο μου ποστ επίτηδες χαρακτήρισα τα s και t ως "cstrings" (αντί για "strings) για να είμαι πιο explicit. Επίσης, τα s και t αποτελούν ιδίωμα της C για μεταβλητές που είναι strings. 1
pavlos1908 Δημοσ. 19 Αυγούστου 2015 Μέλος Δημοσ. 19 Αυγούστου 2015 Κατάλαβα, κι εγώ την ίδια απάντηση έδωσα ότι αντίγραφει στο string t το string s. Αλλά η αλήθεια είναι ότι τόσο επεξηγηματικα και ομορφα δεν θα μπορούσα να το εξηγήσω. Σας ευχαριστώ πολύ όλους για τις απαντήσεις και την βοήθεια σας.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα