Η C είναι απλή/Αλλαγή τύπου / Typecasting

Από Βικιβιβλία

Ας πούμε ότι σας ζητάω να φτιάξετε ένα προγραμματάκι που να ζητάει 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! :-)