Δημοσιεύτηκε: 02 Σεπ 2011, 01:53
από migf1
@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 ) κι εκεί αρχίζει να χαλάει λίγο το πράγμα.