@Star_Light:
Σωστά το κατάλαβες αυτό με την αφαίρεση των ASCII codes

Για το !*s1++ το κατάλαβες νομίζω κι αυτό σωστά, αλλά δεν το εξέφρασες σωστά με λόγια.
Ανεπτυγμένο, το:
- Κώδικας: Επιλογή όλων
if ( !*s1++ ) return 0;
γράφεται ως εξής:
- Κώδικας: Επιλογή όλων
if ( *s1 == '\0' ) { s1++; return 0; }
Και η σταδιακή του σύμπτυξη πάει κάπως έτσι:
- Κώδικας: Επιλογή όλων
if ( *s1 == 0 ) { s1++; return 0; }
- Κώδικας: Επιλογή όλων
if ( *s1++ == 0 ) return 0;
- Κώδικας: Επιλογή όλων
if ( ! ( *s1++ ) ) return 0;
- Κώδικας: Επιλογή όλων
if ( !*s1++ ) return 0;
Με λόγια, εξετάζει αν το περιεχόμενο του δείκτη s1 (δλδ ο χαρακτήρας *s1) ισούται με '\0' και είτε ισούται είτε δεν ισούται με '\0' το περιεχόμενο, ο δείκτης μετακινείται στον επόμενο χαρακτήρα αμέσως μετά τη σύγκριση, πριν ακόμα αποφασίσει το πρόγραμμα αν θα μπει ή όχι στο κυρίως σώμα του if (η απόφαση παίρνεται με τον δείκτη να δείχνει στον αρχικό χαρακτήρα αλλά μέσα στο κυρίως σώμα του if ο δείκτης έχει πάει ήδη στον επόμενο χαρακτήρα).
Μπορείς να το βάλεις μέσα στη συνθήκη του while loop αν θέλεις, αλλά τότε αλλάζει ελαφρώς η λογική, γιατί τότε ναι μεν πάλι θα σταματάει το loop είτε όταν βρεθεί ανόμοιος χαρακτήρας είτε όταν τελειώσουν οι χαρακτήρες του 1ου string, αλλά χάνεις την δυνατότητα να επιστρέψεις την τιμή 0 όταν ικανοποιηθεί η 2η συνθήκη. Θα πρέπει να την ξανά ελέγξεις, πλέον έξω από το loop (μετά το τέλος του δλδ) για να μπορέσεις να την διαχωρίσεις ως προς το τι θα επιστρέψεις ( δλδ return 0 ) κι εκεί αρχίζει να χαλάει λίγο το πράγμα.
Τελευταία επεξεργασία από
migf1 και 02 Σεπ 2011, 02:46, έχει επεξεργασθεί 10 φορά/ες συνολικά