Άρθρο #13: Αλλαγή τύπου / Typecasting

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Πήγαινε κάτω

Άρθρο #13: Αλλαγή τύπου / Typecasting

Δημοσίευση από GReaper Την / Το Σαβ Δεκ 14, 2013 2:56 pm

Ας πούμε ότι σας ζητάω να φτιάξετε ένα προγραμματάκι που να ζητάει 2 ακεραίους απ' τον χρήστη και να εκτυπώνει το πηλίκο, θα ήταν πολύ λογικό θα γράψετε:
Κώδικας:
#include <stdio.h>

int main(void)
{
    int a, b;

    printf("Give two integers: ");
    scanf("%d%d", &a, &b);

    printf("The quotient is %d\n", a/b);

    return 0;
}

Αν αγνοήσω την πιθανότητα να είναι το "b" μηδέν, υπάρχει ένα άλλο εξίσου σημαντικό πρόβλημα. Αν ο χρήστης δώσει πχ "3/2", θα του εμφανίσει "1" αντί για το σωστό "1.666...7" ή το στρογγυλοποιημένο "2". Αυτό γίνεται επειδή η C κάνει ακέραια διαίρεση όταν όλοι οι τελεσταίοι( εδώ το "a" και "b" ) είναι ακέραιοι.
Μια λύση θα ήταν να κάνουμε μια ή και τις δύο μεταβλητές "float" και να αλλάξουμε τις "scanf()" και "printf()". Αυτό είναι εντάξει για το παραπάνω παράδειγμα αλλά τι γίνεται αν αντί για μεταβλητές είχαμε συναρτήσεις που θα επέστρεφαν ακέραιες τιμές;

Η C εδώ έρχεται και με έναν σχετικά πλάγιο τρόπο μας δίνει τη δυνατότητα ουσιαστικά να αλλάξουμε τον τύπο μιας τιμής ή μεταβλητής( προσωρινά ) ώστε να καταφέρουμε αυτό που θέλουμε. Η σύνταξη της εντολής είναι ιδιαίτερη:

(όνομα_τύπου)τιμή

πχ

(int)1.4   <-- Αν το έδινα αυτό σε μια "printf()" θα εκτύπωνε "1"


Άρα, για να κάναμε το παράδειγμά μας να δουλέψει, μπορούσαμε να κάνουμε:
Κώδικας:
#include <stdio.h>

int main(void)
{
    int a, b;

    printf("Give two integers: ");
    scanf("%d%d", &a, &b);

    printf("The quotient is %f\n", a/(float)b);

    return 0;
}

Σημαντικό: Να θυμάστε ότι όταν μετατρέπετε πραγματικούς αριθμούς σε ακέραιους, η C κάνει πάντα στρογγυλοποίηση προς το μηδέν, απλά αγνοώντας το δεκαδικό μέρος. Δεν έχει σημασία αν ο αριθμός ήταν "1.1", "1.4", "1.5", "1.7", ακόμα και "1.99999", αν τον μετατρέψετε σε ακέραιο θα δείτε "1".

Επίσης, η C δεν θα σας αφήσει να αναθέσετε έναν δείκτη σε κάποιον άλλο δείκτη διαφορετικού τύπου ( πχ "int*" σε "float*" ). Η μόνη εξαίρεση είναι ο δείκτης "void*", επειδή είναι κάτι σαν γενικής χρήσης. Αν για οποιονδήποτε λόγο θελήσετε να διαβάσετε τα δεδομένα ενός πίνακα με διαφορετικό τρόπο( αν και δεν το συνιστώ ), ο μόνος τρόπος είναι να αλλάξετε τον τύπο του δείκτη, με την ίδια σύνταξη πχ:
Κώδικας:
float_ptr = (float*)int_ptr;

To ίδιο γίνεται και στην περίπτωση που θέλετε να σας αφήσει ο μεταγλωττιστής να αλλάξετε έναν πίνακα που προηγουμένως είχατε πει ότι είναι "const", με την ίδια ακριβώς σύνταξη. Η συγκεκριμένη τεχνική όμως αποθαρρύνεται από όλους, μαζί με 'μένα!

Happy coding! Smile

GReaper
Admin

Αριθμός μηνυμάτων : 16
Ημερομηνία εγγραφής : 01/10/2011
Ηλικία : 25
Τόπος : Σπάρτη

http://procorn.forumgreek.com

Επιστροφή στην κορυφή Πήγαινε κάτω

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Επιστροφή στην κορυφή


 
Δικαιώματα σας στην κατηγορία αυτή
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης