ΠΕΡΙΕΧΟΜΕΝΑ

 

            Η ΔΟΜΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ C

§         ΟΝΟΜΑΤΑ ΤΑΥΤΟΤΗΤΩΝ

§         ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

o        ΤΡΟΠΟΠΟΙΗΤΕΣ ΤΥΠΩΝ

o        ΤΡΟΠΟΠΟΙΗΤΕΣ ΠΡΟΣΠΕΛΑΣΗΣ

§         ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ

o        ΤΟΠΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ

o        ΤΥΠΙΚΕΣ ΠΑΡΑΜΕΤΡΟΙ

o        ΚΑΘΟΛΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ

§         ΣΤΑΘΕΡΕΣ

o        BACKSLASH CHARACTER CONSTANTS

§         ΤΕΛΕΣΤΕΣ

o        ΑΡΙΘΜΗΤΙΚΟΙ ΤΕΛΕΣΤΕΣ

o        ΣΧΕΣΙΑΚΟΙ ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ

o        ΔΥΑΔΙΚΟΙ ΤΕΛΕΣΤΕΣ

o        Ο ΤΡΙΑΔΙΚΟΣ ΤΕΛΕΣΤΗΣ ?

o        ΤΕΛΕΣΤΕΣ ΔΕΙΚΤΩΝ ΜΝΗΜΗΣ

o        Ο ΤΕΛΕΣΤΗΣ ΧΡΟΝΟΥ ΜΕΤΑΦΡΑΣΗΣ sizeof

o        Ο ΤΕΛΕΣΤΗΣ , (COMMA OPERATOR)

o        ΟΙ ΤΕΛΕΣΤΕΣ . (DOT) KAI -> (ARROW)

o        ΑΓΚΥΛΕΣ ΚΑΙ ΠΑΡΕΝΘΕΣΕΙΣ

o        ΙΕΡΑΡΧΙΑ ΤΕΛΕΣΤΩΝ

§         ΕΚΦΡΑΣΕΙΣ

o        ΜΕΤΑΤΡΟΠΗ ΤΥΠΩΝ ΣΤΙΣ ΕΚΦΡΑΣΕΙΣ

o        CASTS

o        ΚΕΝΑ ΚΑΙ ΠΑΡΕΝΘΕΣΕΙΣ

§         ΣΥΝΤΟΜΟΓΡΑΦΙΕΣ ΣΤΗ C

 

 

 

ΚΕΦΑΛΑΙΟ 1Ο

Η ΔΟΜΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ C

 

Όλες οι δεσμευμένες λέξεις της C είναι γραμμένες με μικρά γράμματα. Στην C τα μικρά διαφέρουν από τα κεφαλαία. Για παράδειγμα το else αποτελεί δεσμευμένη λέξη της C, ενώ το ELSE δεν αποτελεί. Οι δεσμευμένες λέξεις της C απαγορεύεται να χρησιμοποιηθούν σαν ονόματα ταυτοτήτων (μεταβλητές, σταθερές, συναρτήσεις, κλπ).

 

Όλα τα προγράμματα C αποτελούνται από μία ή περισσότερες συναρτήσεις. Η μόνη συνάρτηση η οποία απαραίτητα πρέπει να υπάρχει είναι η main ( ) και είναι η πρώτη συνάρτηση που καλείται όταν αρχίζει η εκτέλεση ενός προγράμματος.

 

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

 

Ένα πρόγραμμα C αποτελείται από μία σειρά συναρτήσεων. Η συνάρτηση χρησιμοποιείται με ευρύτερη έννοια απ’ ότι σε άλλες γλώσσες. Οι συναρτήσεις της C συμπεριλαμβάνουν τη θεωρία των υπορουτίνων και διαδικασιών όπως επίσης και τις συμβατικές συναρτήσεις της PASCAL.

 

Η C διαθέτει μεθόδους επεξεργασίας Ι / Ο. Έτσι τα περισσότερα προγράμματα περιλαμβάνουν κλήσεις συναρτήσεων οι οποίες περιέχονται στις standard βιβλιοθήκες της γλώσσας.

 

Η Turbo C συνοδεύεται από βιβλιοθήκες οι οποίες δίνουν λύσεις σε αρκετές απαιτήσεις. Όταν μία συνάρτηση καλείται, η οποία δεν αποτελεί μέρος του προγράμματος, η C θυμάται το όνομά της. Αργότερα ο linker συνδέει το πρόγραμμα με τον αντικειμενικό κώδικα που βρίσκεται στις βιβλιοθήκες. Η δράση μια συνάρτησης εξαρτάται πλήρως από τις εντολές που χρησιμοποιήθηκαν στον ορισμό της και από τις τιμές των ορισμάτων, αν υπάρχουν. Το αποτέλεσμα μπορεί να είναι μία επιστρεφόμενη τιμή, όπως συμβαίνει στις συναρτήσεις ή απλά μία ενέργεια όπως συμβαίνει στις διαδικασίες.

 

                        Καθολικές Δηλώσεις

                        main( )

                        {

                                         Γενικές Μεταβλητές;

                                         Δηλώσεις Προγράμματος;

                        }

                        f1( )

                        }

                                         Τοπικές Μεταβλητές;

                                         Δηλώσεις Προγράμματος;

                        }


ΟΝΟΜΑΤΑ ΤΑΥΤΟΤΗΤΩΝ

 

Η Turbo C ορίζει τα ονόματα τα οποία χρησιμοποιούνται για αναφορά σε μεταβλητές, συναρτήσεις, ετικέτες και διάφορα άλλα αντικείμενα οριζόμενα από τον χρήστη σαν ταυτότητες (identifiers).

 

Μία ταυτότητα μπορεί να διαθέτει από 1 ως 32 χαρακτήρες. Ο πρώτος χαρακτήρας πρέπει να είναι γράμμα ή underscore ( _ ) ενώ οι επόμενοι γράμματα, αριθμοί ή underscores. Η Turbo C επιτρέπει και τη χρήση $, αλλά δεν είναι στάνταρ και δεν ενδείκνυται.

Έτσι:

                        ΣΩΣΤΟ                                                                                                ΛΑΘΟΣ

                        Count1                                                                                                 1Count

                        Test23                                                                                                 hi ! There

                        high_balance                                                                                       high. . balance

 

Στη C τα κεφαλαία και τα μικρά χαρακτηρίζονται ως διαφορετικά. Έτσι τα count, Count και COUNT είναι διαφορετικές ταυτότητες.

 

 

ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (DATA TYPES)

 

Υπάρχουν 5 βασικοί τύποι δεδομένων στην C. character, integer, floating point, double floating point και valueless.

 

Τύπος

Εύρος Bit

Εύρος Τιμών

char                    

8 bit

0 έως 255 (ASCII χαρ. ή οποιοδήποτε 8 bit)

int

16 bit

-32768  έως  +32767

float

32 bit

3.4E-38  έως   3.4E+38

double

64 bit

1.7E-308   έως   1.7E+308

void

0 bit     

valueless

 

 

            Ο τύπος char χρησιμοποιείται για την αποθήκευση ASCII χαρακτήρων. Ο τύπος int για την αποθήκευση ακεραίων. Οι τύποι float και double για την αποθήκευση πραγματικών αριθμών (οι πραγματικοί αριθμοί έχουν ακέραιο και κλασματικό μέρος).

 

            Ο τύπος void έχει δύο χρήσεις. Η πρώτη χρησιμοποιείται κατηγορηματικά για τη δήλωση μιας συνάρτησης που δεν επιστρέφει τιμή, ενώ η δεύτερη για τη δημιουργία generic pointers. Η C υποστηρίζει και άλλους τύπους όπως:

 

                          structures                                      (Δομές)

                          unions                                            (Ενώσεις_Sets)

                          bit fields                                         (Δυαδικά πεδία)

                          enumerations                                (Απαριθμητές)

                          user defined Types                       (Ορισμένοι από το χρήστη)

 

 

ΤΡΟΠΟΠΟΙΗΤΕΣ ΤΥΠΩΝ (TYPE MODIFIERS)

 

            Εξαιρώντας τον τύπο void, οι βασικοί τύποι δεδομένων συνοδεύονται από μερικούς τροποποιητές (modifiers). Ένας τροποποιητής χρησιμοποιείται για να αλλάξει το νόημα του βασικού τύπου και να τον προσαρμόσει σε διάφορες καταστάσεις με μεγαλύτερη ακρίβεια.

 

 

            Αυτοί είναι:

                                    signed                         Προσημασμένος

                                    unsigned                     Απρόσημος

                                    long                             Μεγάλος

                                    short                           Μικρός

 

Οι παραπάνω τροποποιητές μπορούν να προσαρμοστούν στους τύπους char και int. Ωστόσο το long μπορεί να προσαρμοστεί στον τύπο double. Είναι πλεονασμός πάντως να δηλώνουμε έναν ακέραιο σαν signed. Η διαφορά μεταξύ signed και unsigned integers είναι στον τρόπο με τον οποίο ερμηνεύεται το highvalue bit.

            Π.χ.

                                 127     σε δυαδικό      :    00000000     01111111

                               -127           > >             :    10000000     01111111                            

 

Τύπος

Εύρος Bit

Εύρος Τιμών

char

8

-128 έως  +127

unsigned char

8

0    έως   255

singed char

8

-128  έως    +127

int

16

-32768  έως   32767

unsigned int

16

0    έως  65535

signed int

16

-32768  έως   32767

short [int]

16

-32768  έως  32767

unsigned short [int]

16

0  έως   65535

long [int]

32

-2147483648 έως   214748364

float

32

3.4E-38  έως   3.4E+38

double

64

1.7E-308 έως  1.7E+308

long double

64

1.7E-308  έως  1.7E+308

unsigned long [int]

32

0  έως  +4294967295

 

 

 

 

 

ΤΡΟΠΟΠΟΙΗΤΕΣ ΠΡΟΣΠΕΛΑΣΗΣ (ACCESS MODIFIERS)

 

            H Turbo C έχει δύο είδη τροποποιητών οι οποίοι χρησιμοποιούνται για να ελέγχουμε τους τρόπους με τους οποίους οι μεταβλητές προσπελαύνονται ή τροποποιούνται. Αυτοί είναι οι:

 

                                                                                                                                                const               (Σταθερός)

                                                                                                                                                volatile             (Ασταθής)

 

            Οι μεταβλητές που έχουν δηλωθεί σαν const δε μπορούν να αλλάξουν περιεχόμενο κατά τη διάρκεια της εκτέλεσης του προγράμματος.

            Π.χ.

 

const int a = 10;          Εδώ δηλώνουμε μία μεταβλητή, την a η οποία δε μπορεί να αλλάξει τιμή αλλά μπορεί να χρησιμοποιηθεί σε άλλους τύπους ή εκφράσεις.

Μία σταθερά μπορεί να λάβει τιμή, είτε από κάποια κατηγορηματική έκφραση,

είτε από κάποια έννοια η οποία εξαρτάται από το hardware.

 

            Ο τροποποιητής volatile χρησιμοποιείται για να πει στον compiler ότι η τιμή μιας μεταβλητής μπορεί να αλλάξει με τρόπους όχι ρητά ορισμένους από το πρόγραμμα. Για παράδειγμα μία διεύθυνση μιας συνολικής (global) μεταβλητής μπορεί να περαστεί στη ρουτίνα του ρολογιού του συστήματος για να κρατά την ώρα του συστήματος. Σ’ αυτή την περίπτωση τα περιεχόμενα της μεταβλητής αλλάζουν χωρίς τη χρήση κατηγορηματικών δηλώσεων στο πρόγραμμα. Αυτό είναι σημαντικό γιατί η turbo C αυτόματα θα κάνει την παραδοχή ότι το περιεχόμενο της μεταβλητής παραμένει ανέπαφο.

 

            Είναι δυνατό να χρησιμοποιήσουμε τους τροποποιητές const και volatile ταυτόχρονα.

 

ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ

 

            Όλες οι μεταβλητές πρέπει να έχουν δηλωθεί πριν χρησιμοποιηθούν. Ο τρόπος δήλωσης είναι:

 

                                                                                       Τύπος μετ1, μετ2, μετ3, …, μετν;

            Πχ:

                          int i, j, l;

                          short int si;

                          unsigned int ui;

                          double balance, profit, loss;

 

Υπάρχουν τέσσερα βασικά μέρη στα οποία δηλώνονται οι μεταβλητές.

 

-          Μέσα στις συναρτήσεις

-          Στη δήλωση των παραμέτρων της συνάρτησης και

-          Έξω από όλες τις συναρτήσεις, στην αρχή ενός αυτόνομου προγράμματος.

-          Έξω από όλα τα προγράμματα (σε αυτόνομο αρχείο ή πρίν τη συνάρτηση main() των προγραμμάτων μιας εφαρμογής).

 

Έτσι καλούνται:

 

-          Local Variables (Τοπικές)

-          Formal Parameters (Τυπικοί παράμετροι)

-          General Variables (Γενικές)

-          Global Variables (Καθολικές)

 

 

ΤΟΠΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ (LOCAL VARIABLES)

 

              Οι μεταβλητές οι οποίες δηλώνονται μέσα σε μία συνάρτηση ονομάζονται local variables. Σε πολλές περιπτώσεις τις συναντούμε και σαν automatic variables γιατί η C, προαιρετική χρησιμοποιεί τη λέξη auto για τη δήλωσή τους. Οι τοπικές μεταβλητές θα αναφέρονται μόνο σε δηλώσεις και εκφράσεις που βρίσκονται στο ίδιο τμήμα που αυτές έχουν δηλωθεί. Οι τοπικές μεταβλητές δεν είναι αναγνωρίσιμες έξω από το τμήμα του κώδικα που έχουν δηλωθεί. Σημειώνεται ότι ένα τμήμα κώδικα ξεκινά όταν ανοίγει ένα άγκιστρο (curly brace) και τελειώνει όταν συναντηθεί άγκιστρο που κλείνει.

 

              Ένα από τα πιο σημαντικά πράγματα για την κατανόηση των local variables είναι ότι υπάρχουν μόνο εφόσον το τμήμα του κώδικα για το οποίο γράφτηκαν εκτελείται. Έτσι μία τοπική μεταβλητή δημιουργείται τη στιγμή της εισόδου στο block και καταστρέφεται τη στιγμή της εξόδου. Το πιο συνηθισμένο block κώδικα το οποίο χρησιμοποιείται μια τοπική μεταβλητή είναι η συνάρτηση.

 

              Π.χ.

              func1( )

              {

                         int x;

                         x=10;

              }

              func2( )

              {

                        int x,y;

                        x=-199 ;

                        y=200 ;

              }

 

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

           

            Είναι κοινή πρακτική να δηλώνονται όλες οι απαιτούμενες τοπικές μεταβλητές στην αρχή της συνάρτησης. Αυτό γίνεται για την απλούστευση της συνάρτησης του προγράμματος. Πάντως δεν είναι απαραίτητο γιατί οι μεταβλητές μπορούν να δηλωθούν μέσα σε οποιοδήποτε block.

            Π.χ.

                                    func1( )

                                    {

                                           int x;

                                           scanf(“%d”, &x);

                                           if   (x==1)

                                           {

                                                char   5[80] ;

                                                printf(“Cuter Name”);

                                           }

                                    }

 

            Εδώ η μεταβλητή s θα δημιουργηθεί κατά την είσοδο στο block και θα καταστραφεί κατά την έξοδο. Επιπλέον η s είναι γνωστή μόνο μέσα στο if block και δεν αναφέρεται πουθενά αλλού, ούτε ακόμα μέσα στη συνάρτηση που περιέχει.

 

            Το μεγαλύτερο όφελος που κερδίζουμε δηλώνοντας μια τοπική μεταβλητή είναι η εξοικονόμηση μνήμης και αυτό γιατί δεν έχουμε δέσμευση RAM αν δεν εκτελεστεί το τμήμα στο οποίο έχει δηλωθεί η μεταβλητή. Επειδή οι τοπικές μεταβλητές δημιουργούνται και καταστρέφονται με την κλήση και την έξοδο από μία ρουτίνα, είναι λογικό να χάνουν τα περιεχόμενά τους μετά το τέλος αυτής. Αυτό σημαίνει ότι δεν διατηρούν τα περιεχόμενά τους μεταξύ των διάφορων κλήσεων.

 

 

ΤΥΠΙΚΕΣ ΠΑΡΑΜΕΤΡΟΙ (FORMAL PARAMETERS)

 

            Ενδέχεται να χρησιμοποιήσουμε μεταβλητές σαν παραμέτρους σε συναρτήσεις ή ρουτίνες. Η δήλωσή τους γίνεται μέσα στις παρενθέσεις της συνάρτησης αλλά και μετά από αυτές.

                                                                  Π.χ.

                                                                 synartisi (a,b)

                                                                 int a ;

                                                                 float b ;

                                                                 {

                                                                         εντολές;

                                                                 }

 

            Πρέπει φυσικά να δηλωθεί και ο τύπος αυτών των μεταβλητών και εφόσον γίνει αυτό χρησιμοποιούνται σαν τοπικές μεταβλητές μέσα στη συνάρτηση. Φυσικά θα πρέπει να είναι ίδιου τύπου με τις μεταβλητές που χρησιμοποιούνται για την κλήση της συνάρτησης.

 

            Η Turbo C ενδέχεται να δώσει αποτέλεσμα ακόμη και σε περίπτωση λάθους. Υπάρχουν λίγα run-time errors και καθόλου έλεγχος ορίων (bound checking). Σαν προγραμματιστής έχετε την ευθύνη να σιγουρέψετε ότι δε θα συμβούν λάθη.

 

 

ΚΑΘΟΛΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ (GLOBAL VARIABLES)

 

            Αντίθετα από τις τοπικές μεταβλητές οι συνολικές είναι γνωστές σε όλο το φάσμα του προγράμματος  και χρησιμοποιούνται από κάθε κομμάτι του. Επίσης συγκρατούν τις τιμές τους καθ’ όλη τη διάρκεια της εκτέλεσης του κώδικα. Τις δηλώνουμε έξω από κάθε συνάρτηση (ακόμα και τη main). Προσπελαύνονται από οποιαδήποτε έκφραση σε οποιαδήποτε συνάρτηση όπου και αν βρίσκεται αυτή. Τυπικά η δήλωση γίνεται πριν από τη main( ), αλλά μπορεί να δηλωθεί έξω από κάθε συνάρτηση, φυσικά πριν χρησιμοποιηθεί.

 

                                      #include <stdio.h>

                                      int count;

                                      main( )

                                      {

                                            count=100;

                                            func1( );

                                      }

                                      func1( );

                                      {

                                            int temp;

                                            temp=count;

                                      func2( );

                                      }

                                      func2( )

                                      {

                                           int count;

                                           count=50;

                                      }

 

            Οι συναρτήσεις main( ) και func1( ) χρησιμοποιούν τη μεταβλητή count χωρίς να έχει γίνει δήλωση μέσα σε αυτές. Επίσης στην func2( ) υπάρχει μία μεταβλητή count η οποία όμως είναι τοπική και όχι συνολική και η οποία δεν έχει καμία σχέση με την συνολική count. Οποιαδήποτε αναφορά στην count μέσα στην func2( ) δεν επιφέρει καμία αλλαγή στην εξωτερική count. Αν ξεχάσουμε αυτόν τον περιορισμό το πρόγραμμα μπορεί να αντιδράσει περίεργα ακόμη κι αν αυτό φαίνεται σωστό.

 

            Η αποθήκευση των γενικών μεταβλητών γίνεται σε ένα καθορισμένο τμήμα της μνήμης το οποίο δεσμεύεται από τον compiler για αυτό το σκοπό. Οι γενικές μεταβλητές είναι πολύ χρήσιμες καθώς τα ίδια δεδομένα χρησιμοποιούνται από πολλές συναρτήσεις μέσα στο πρόγραμμα.

 

            Τα κυριότερα προβλήματά τους είναι:

 

i)           Πιάνουν αρκετό χώρο μνήμης γιατί χρησιμοποιούνται σε όλη την εκτέλεση του προγράμματος και όχι όταν χρειάζονται.

ii)         Χρησιμοποιώντας μία γενική μεταβλητή κάνουμε μία συνάρτηση λιγότερο αποδοτική γιατί αυτή πλέον στηρίζεται σε κάτι το οποίο δεν είναι δηλωμένο μέσα της.

iii)        Η χρήση πολλών global variables οδηγεί σε σφάλματα κυρίως unknown ή unwanted. Αυτό συμβαίνει στην BASIC όπου όλες οι μεταβλητές είναι global.

 

Ένα σοβαρό πρόβλημα στην ανάπτυξη μεγάλων εφαρμογών είναι η αναπόφευκτη αλλαγή της τιμής μίας μεταβλητής εξαιτίας της χρήσης της κάπου αλλού. Αυτό συμβαίνει στην C εάν οι μεταβλητή είναι δηλωμένη global.

 

Το κυριότερο σημείο μίας δομημένης γλώσσας είναι η τμηματοποίηση κώδικα και δεδομένων. Στην C αυτό κατορθώνεται με τη χρήση τοπικών μεταβλητών και συναρτήσεων.

 

 

ΣΤΑΘΕΡΕΣ (CONSTANTS)

 

Οι σταθερές στην C είναι τιμές οι οποίες δεν αλλάζουν κατά τη διάρκεια του προγράμματος. Μπορούν να είναι οποιουδήποτε τύπου. Η C υποστηρίζει ακόμα ένα τύπο σταθεράς εκτός από τους προκαθορισμένους, αυτός είναι ο τύπος string. Όλες οι σταθερές τύπου string περικλείονται από “  “ . Δεν πρέπει να γίνεται σύγχυση των string με τα char. Μία απλή char σταθερά περικλείεται από ‘  ‘ , (π.χ. ‘α’). Στην ουσία τα string είναι arrays of characters.

 

 

BACKSLASH CHARACTER CONSTANTS

 

Το κλείσιμο χαρακτήρων μέσα σε single quotes, “δουλεύει” για τους περισσότερους εκτυπώσιμους χαρακτήρες, αλλά μερικοί όπως το return, το bell, κτλ, δε μπορούν να εισαχθούν από το πληκτρολόγιο. Για αυτούς η C δεσμεύει τους λεγόμενους backslash codes.

 

 

 

Code

\b

\n

\r

\t

\”

\,

\0

\\

\v

\a

\o

\x

Έννοια

Backspace

New Line

Carriage Return

Horizontal Tab

Double Quotation Marks

Single Quotation Marks

Null

Backslash

Vertical Tab

Alert

Octal Constant

Hex Constant

 

 



 

            Χρησιμοποιούμε τους backslash codes ακριβώς με τον ίδιο τρόπο που χρησιμοποιούμε και τους άλλους χαρακτήρες.

 

            Π.χ.

                     ch=”\t”;

                     printf(“This is a test  \n”);

 

            Όπου πρώτα μεταδίδεται ένα tab στην ch και μετά τυπώνεται ένα string ακολουθούμενο από νέα γραμμή.

 

ΤΕΛΕΣΤΕΣ (OPERATORS)

 

            Η C διαθέτει αρκετούς ενσωματωμένους τελεστές. Ένας τελεστής οδηγεί τον compiler στην εκτέλεση συγκεκριμένων λογικών ή μαθηματικών χειρισμών. Οι κύριοι είναι:

 

 

 

 

(1)   ΑΡΙΘΜΗΤΙΚΟΙ

 


-

+

*

/

%

--

++

Αφαίρεση, αποκλειστικό μείον

Πρόσθεση

Πολλαπλασιασμός

Διαίρεση

Υπόλοιπο διαίρεσης (Modulo Division)

Μείωση

Αύξηση


 

-                      Όταν χρησιμοποιούμε το / σε μία διαίρεση integer ή character το υπόλοιπο στρογγυλοποιείται (trunc).

Π.χ.                                 10/3=3                                                                     integer division

-                      Επίσης ο τελεστής % χρησιμοποιείται όπως το MOD σε άλλες γλώσσες. Ο τελεστής % δε μπορεί να χρησιμοποιηθεί με FLOAT ή DOUBLE τύπους.

 

Αύξηση και μείωση

 

            Δύο πολύ χρήσιμοι τελεστές στη C, οι οποίοι δε χρησιμοποιούνται γενικά από άλλες γλώσσες προγραμματισμού είναι οι ++ και --. Ο τελεστής ++ προσθέτει 1 στον τελεστέο του, ενώ ο – αφαιρεί 1. Για παράδειγμα:

 

                                                                                                                                x=x+1;      είναι το ίδιο με             ++x;

                                                                                                                                 x=x-1;      είναι το ίδιο με             --x;

            Και οι δύο τελεστές αυτοί μπορούν να προηγούνται ή να ακολουθούν τον τελεστέο. Πχ το:

           

x=x+1; μπορεί να γραφτεί και ++x; και x++;

 

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

 

-          Όταν ο τελεστής προηγείται του τελεστέου η C εκτελεί την αύξηση (ή τη μείωση) πριν χρησιμοποιήσει την τιμή του τελεστέου.

-          Αν ο τελεστής ακολουθεί τον τελεστέο, τότε η C πρώτα χρησιμοποιεί την τιμή του τελεστέου και κατόπιν εκτελεί την ενέργεια της αύξησης (ή της μείωσης).

 

Π.χ.

                             x=10;                                                                                  To y=11;

                            y=++x;                                                                                 &  x=11

 

                             x=10;                                                                                  To y=10;

                            y=x++;                                                                                 &  x=11

 

 

            Έχουμε σοβαρά πλεονεκτήματα όταν μπορούμε να ελέγξουμε πότε η αύξηση ή μείωση λαμβάνουν χώρα.

 

            Η προτεραιότητα των αριθμητικών τελεστών έχει ως εξής:

 

Υψηλότερη

 

 

Χαμηλότερη

++        --

-   (unary minus)

*      /      %

+     -

 

Οι τελεστές της ίδιας προτεραιότητας υπολογίζονται από τον compiler από τα αριστερά προς τα δεξιά. Φυσικά μπορούν να χρησιμοποιηθούν για να αλλάξουν την κατάσταση της ιεραρχίας.

 

 

 

(2)   ΣΧΕΣΙΑΚΟΙ ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ

 

Οι σχεσιακοί τελεστές αναφέρονται σε σχέσεις που μπορούν να υπάρχουν μεταξύ των αξιών. Οι λογικοί τελεστές αναφέρονται στους τρόπους με τους οποίους οι ανωτέρω σχέσεις μπορούν να συνδέονται χρησιμοποιώντας τους κανόνες της κοινής λογικής.

 

Το κλειδί στα σύνολα των σχεσιακών και λογικών τελεστών είναι η ιδέα του True και False. Στη C True είναι κάθε τιμή διάφορη του 0. Το 0 είναι False. Εκφράσεις που χρησιμοποιούν σχεσιακούς και λογικούς τελεστές θα επιστρέψουν 0 αντί για False και 1 για True. Ο πίνακας αληθείας των λογικών τελεστών είναι:

 

p

q

p AND q

p OR q

NOT p

0

0

0

0

1

0

1

0

1

1

1

1

1

1

0

1

0

0

1

0

 

Σχεσιακοί Τελεστές

 

> 

>=

< 

<=

==

!=

Ενέργεια

 

Μεγαλύτερο

Μεγαλύτερο ή ίσο

Μικρότερο

Μικρότερο ή ίσο

Ίσο

Διάφορο

 

 

Λογικοί Τελεστές

 

&&

!

Ενέργεια

 

AND       Λογική Σύζευξη

OR         Λογική Διάζευξη

NOT       Λογική Άρνηση

 

 


ΙΕΡΑΡΧΙΑ ΣΧΕΣΙΑΚΩΝ ΚΑΙ ΛΟΓΙΚΩΝ ΤΕΛΕΣΤΩΝ

 

!

>, >=, <, <=

==, !=

&&

Υψηλότερη

 

 

 

Χαμηλότερη

 

 

 

 


     

      Και οι σχεσιακοί και οι λογικοί τελεστές ιεραρχούνται κάτω από τους αριθμητικούς.

 

                                            Π.χ. μία έκφραση όπως:                                                 

                                                                        10>1+12 εξηγείται σαν 10>(1+12) και

                                                                        φυσικά επιστρέφει False.

 

Π.χ.               10>5  && !(10<9) 3<=4 

 

 

                       Έχουμε : 10 > 5 επιστρέφει 1.

                                       10 < 9 επιστρέφει 0.

                                         3 <=4 επιστρέφει 1.

 

                       Άρα η παραπάνω έκφραση διαμορφώνεται : 1 && !0 || 1, όμως το !0 επιστρέφει 1, άρα η έκφραση διαμορφώνεται : 1 && 1 || 1

 

                       Με δεδομένο, ότι οι εκφράσεις εκτελούνται από αριστερά προς τα δεξιά και με βάση την ιεραρχία των τελεστών έχουμε 1 &&1 || 1 = 1 || 1 = 1.

                                                                     

                       Άρα True!!!

 

 

            Όπως στις αριθμητικές, έτσι και στις σχεσιακές ή λογικές εκφράσεις, χρησιμοποιούμε τις παρενθέσεις για να επιτύχουμε την αλλαγή της ιεραρχίας.

            Π.χ.

                                                 !1&&0   επιστρέφει False γιατί το ! ιεραρχείται πρώτο και μετά το AND

            Ενώ:

                                                 !(1&&0)  επιστρέφει True.

 

          Υπενθυμίζουμε ότι όλες οι σχεσιακές και λογικές προτάσεις επιστρέφουν 0 ή 1.

 

Π.χ.

            int=x;                                        Το πρόγραμμα αυτό τυπώνει τον αριθμό 1 στην

            x=100;                                     οθόνη,

            printf(“%d”,x>10);                     γιατί η σχεσιακή έκφραση είναι True.

 

 

(3)   ΔΥΑΔΙΚΟΙ ΤΕΛΕΣΤΕΣ (BITWISE OPERATORS)

 

Αντίθετα από άλλες γλώσσες η C υποστηρίζει ένα πλήρες συμπλήρωμα δυαδικών τελεστών. Εφόσον η C σχεδιάστηκε να πάρει τη θέση της ASSEMBLY θα έπρεπε να έχει τη δυνατότητα να εκτελέσει τις περισσότερες πράξεις που υποστηρίζει η ASSEMBLY. Δυαδικές πράξεις είναι ο έλεγχος, η τοποθέτηση και η μετακίνηση των ενεργών bit μέσα σε ένα byte ή word, οι οποίες ταιριάζουν στους τύπους char και int. Οι δυαδικές πράξεις δε μπορούν να εκτελεστούν με τους τύπους:

Float, double, long double και void ή με άλλους πιο πολύπλοκους τύπους.

 

            Τα δυαδικά NOT, OR και AND έχουν τον ίδιο πίνακα αληθείας με τα λογικά τους ισοδύναμα με μόνη διαφορά ότι εργάζονται σε επίπεδο bit-to-bit. Ο πίνακας αληθείας του αποκλειστικού OR (XOR) είναι:

 

p

q

p^q

0

0

0

1

0

1

1

1

0

0

1

1

 

            Όπως δείχνει ο πίνακας το αποτέλεσμα του XOR είναι TRUE μόνο όταν ένας (μόνο ένας) από τους τελεστέους είναι αληθής. Αλλιώς είναι FALSE.

 

            Οι δυαδικοί τελεστές βρίσκουν εφαρμογή κυρίως σε προγραμματισμό device drivers, επικοινωνίες συσκευών (modem), ρουτίνες αρχείων (δυαδικών) και αυτό γιατί υποστηρίζουν bits όπως το parity bit (parity bit είναι το high order bit το οποίο ελέγχει αν τα υπόλοιπα bit στο byte έχουν υποστεί αλλαγές).

 

            Το δυαδικό AND κυρίως χρησιμοποιείται για την τοποθέτηση ενός συγκεκριμένου bit σε κατάσταση off.

 

Τελεστής

&

^

~

>> 

<< 

Ενέργεια

AND

OR

Αποκλειστικό OR (XOR)

NOT

Δεξιά ολίσθηση

Αριστερή ολίσθηση

 

Π.χ.

            Το παρακάτω παράδειγμα χρησιμοποιεί τη συνάρτηση read_modem( ) και τοποθετεί το parity bit στο 0.

 

                                           char ch;

                                           ch=read_modem( );

                                           return(ch & 127);

 

            To parity είναι το 8o bit το οποίο με τη χρήση του AND τοποθετεί το 0, σε ένα byte όπου τα 7 πρώτα bit είναι 1 και το 8o 0.

 

            Η έκφραση ch & 127 σημαίνει εκτέλεση της AND μεταξύ του ch και του 127. Το καθαρό αποτέλεσμα είναι ότι το 8o bit του ch τοποθετείται στο 0. Στο παρακάτω παράδειγμα υποθέτουμε ότι το ch λαμβάνει σαν τιμή τον χαρακτήρα ‘A’ και χρησιμοποιεί parity bit.

 

            1    1    0    0    0    0    0    1                   Χαρ. ‘A’ με parity bit το 127 στο δυαδικό

            0    1    1    1    1    1    1    1                                           Εκτέλεση δυαδικού AND

       &                                                                                                                                

            0    1    0    0    0    0    0    1                                             Χαρ. ‘A’ χωρίς parity bit

 

            Το δυαδικό OR σαν αντίθετο του AND, χρησιμοποιείται για να θέτει τα bit σε κατάσταση on. Κάθε bit τοποθετημένο στο 1 σε κάθε τελεστέο θα προκαλέσει την τοποθέτηση στο 1 του ανάλογου bit στη μεταβλητή.

            Π.χ.

                        128 3 :

 

            1    0    0    0    0    0    0    0                      Δυαδικό 128

            0    0    0    0    0    0    1    1                      3 Δυαδικό

                                                                              bitwise OR

            1    0    0    0    0    0    1    1                      Αποτέλεσμα

 

            Ένα αποκλειστικό OR (XOR) θα θέσει ένα bit σε κατάσταση on, μόνο αν τα δύο συγκρινόμενα bit είναι διαφορετικά.

            Π.χ.

                        127^120:

 

            0    1    1    1    1    1    1   1                                                               127 Δυαδικό

            0    1    1    1    1    0    0   0                                                               120 Δυαδικό

       ^                                                                                                              bitwise XOR

            0    0    0    0    0    1    1    1                                                               Αποτέλεσμα

            Σε γενικές γραμμές τα δυαδικά AND, OR και XOR εφαρμόζουν τις ενέργειές τους κατ’ ευθείαν σε κάθε bit της μεταβλητής. Γι’ αυτό το λόγο οι δυαδικοί τελεστές δε χρησιμοποιούνται σε δηλώσεις συνθηκών με τον ίδιο τρόπο που χρησιμοποιούνται οι λογικοί τελεστές. Για παράδειγμα:

                                                          Εάν  x = 7 τότε

                                                    x && 8 = True (1) ενώ

                                                       x & 8 = False (0).

            Σημειώνεται ότι οι δυαδικοί τελεστές παράγουν αυθαίρετες τιμές σε συμφωνία φυσικά με τη συγκεκριμένη ενέργεια. Μ’ άλλα λόγια παράγουν και τιμές διάφορες του 0 και 1.

 

Shift Operators (Τελεστές Ολίσθησης)

 

            Οι τελεστές ολίσθησης μετακινούν όλα τα bit σε μία μεταβλητή αριστερά ή δεξιά όπως δηλώνεται. Η κύρια φόρμα δήλωσης είναι:

                                                                    

                                                                                                        variable > > no of bits

                                                                                                        variable < < no of bits

 

            Καθώς τα bit ολισθαίνουν προς μία πλευρά, μηδενικά εμφανίζονται στην άλλη. Η ολίσθηση δε σημαίνει κύλιση. Τα bit που ολισθαίνουν στην άκρη χάνονται για πάντα και δε μπορούν να επαναφερθούν.

 

            Οι τελεστές ολίσθησης χρησιμοποιούνται κυρίως στην εκσφαλμάτωση εισόδων εξωτερικών συσκευών, διάβασμα status information, αλλά και στην εκτέλεση γρήγορων πολλαπλασιασμών και διαιρέσεων ακεραίων. Μία ολίσθηση δεξιά πολλαπλασιάζει έναν ακέραιο με το 2, ενώ μία ολίσθηση αριστερά τον διαιρεί δια 2.

 

 

(4)   ΤΡΙΑΔΙΚΟΣ ΤΕΛΕΣΤΗΣ ? (TERNARY OPERATOR)

 

H C διαθέτει έναν ισχυρό τελεστή ο οποίος χρησιμοποιείται για να υποκαταστήσει δηλώσεις του τύπου if-else. Η κύρια φόρμα του τριαδικού τελεστή είναι:

                                                                                                                                         

                                                                                                                                                      Exp1    ?     Exp2    :    Exp3

 

όπου Exp1, Exp2 και Exp3 είναι εκφράσεις. Ο τελεστής ? λειτουργεί ως εξής:

Εκτελείται η έκφραση Exp1. Αν είναι αληθής τότε εκτελείται η έκφραση Exp2 αλλιώς εκτελείται η Exp3.

Π.χ.

            x=10;

            y=x>9    ?    100   :   200;

 

            Σ’ αυτό το παράδειγμα η y θα πάρει την τιμή 100. Αν ο x ήταν 9 η y θα έπαιρνε την τιμή 200. Με if και else θα γραφόταν ως εξής:

            x=10;

            if  (x>9)   y = 100;

            else   y = 200 ;

 

 

(5)   ΤΕΛΕΣΤΕΣ ΔΕΙΚΤΩΝ ΜΝΗΜΗΣ (POINTER OPERATORS)

 

Ένας pointer είναι η διεύθυνση μνήμης μιας μεταβλητής. Μία μεταβλητή τύπου pointer είναι μία μεταβλητή η οποία έχει δηλωθεί για να κρατά έναν pointer. Οι pointers έχουν δύο βασικούς τρόπους χρήσης στη C.

1.      Παρέχουν γρήγορη αναφορά σε στοιχεία πινάκων.

2.      Επιτρέπουν στις συναρτήσεις της C να τροποποιούν τις καλούμενες παραμέτρους.

 

Ο Pointer Τελεστής & (Address)

 

            Είναι ένας μονοσήμαντος τελεστής ο οποίος επιστρέφει τη διεύθυνση μνήμης του τελεστέου του.

            Π.χ.

                                                            m=&count;

            Τοποθετεί στην m τη διεύθυνση μνήμης της count. Υπενθυμίζεται ότι η ανωτέρω πράξη δεν έχει καμία επίπτωση στην αξία της count. Απλά αναφέρεται στη θέση όπου την έχει τοποθετήσει ο υπολογιστής στη μνήμη. Αν υποθέσουμε ότι ο η/υ έχει τοποθετήσει την count στη θέση ΑΒ25 τότε η m θα πάρει αυτή την τιμή.

 

Ο Pointer Τελεστής * (At Address)

 

At Address)

 

            Ο τελεστής αυτός είναι το συμπλήρωμα του &. Είναι ένας μονοσήμαντος τελεστής ο οποίος επιστρέφει την τιμή της μεταβλητής η οποία βρίσκεται στη διεύθυνση μνήμης η οποία τον ακολουθεί.

            Π.χ.

            Αν η m περιέχει τη διεύθυνση μνήμης της μεταβλητής count τότε η έκφραση:    

                                                                                                                                                q=*m

 

θα τοποθετήσει την τιμή της count  στην q.

Αν π.χ. η count=100 τότε και q=100.

Σ’ αυτή την περίπτωση μπορούμε να πούμε ότι η q παίρνει την τιμή της διεύθυνσης m.

 

            Παρεμπιπτόντως το σύμβολο του πολλαπλασιασμού (*) και ο τελεστής * είναι ίδια, καθώς επίσης και ο δυαδικός τελεστής & και ο pointer τελεστής &. Οι τελεστές αυτοί δεν έχουν καμία σχέση μεταξύ τους. Οι pointer τελεστές ιεραρχούνται ανώτερα από όλους τους αριθμητικούς, εκτός από τον μονοσήμαντο ‘-‘ όπου είναι ίσοι.

 

            Οι μεταβλητές που περιέχουν pointer πρέπει να δηλώνονται ανάλογα. Δηλώνονται με ένα * στην αρχή της μεταβλητής για να ξεκαθαρίζει ο compiler ότι θα κρατήσει έναν pointer γι’ αυτό τον τύπο μεταβλητής. Π.χ. για να δηλώσουμε μία μεταβλητή char pointer η οποία θα λέγεται ch θα γράψουμε:

                                                                                                                                               

                                                                                                                                                            char   *ch;

 

            Εδώ η ch δεν είναι χαρακτήρας αλλά ένας pointer σε χαρακτήρα. Υπάρχει μεγάλη διαφορά. Ο τύπος δεδομένων που θα δείχνει ο pointer ονομάζεται βασικός τύπος του pointer.

 

            Σε γενικές γραμμές η μεταβλητή pointer είναι μία μεταβλητή η οποία θα χρησιμοποιηθεί για να τοποθετηθεί η διεύθυνση ενός αντικειμένου του βασικού τύπου. Είναι βασικό να θυμόμαστε ότι ένας pointer πρέπει να χρησιμοποιείται για να δείχνει, μόνο σε δεδομένα που έχουν τύπο το βασικό τύπο του δείκτη.

 

            Μπορούμε να αναμίξουμε μαζί και pointer και μάκρο μεταβλητές κατά τη διάρκεια της δήλωσης.

            Π.χ.

                                                                                                               int x,   *c,   count;

 

            Αυτό το παράδειγμα δηλώνει την x και την count σαν ακεραίους ενώ το c σαν pointer με βασικό τύπο ακέραιο.

 

            Στο παρακάτω παράδειγμα οι τελεστές * και & χρησιμοποιούνται για να τοποθετήσουν την τιμή 10 σε μία μεταβλητή, την target.

            Π.χ.

                                             main( )

                                             {

                                                  int target, source;

                                                  int *m;

                                                  source=10;

                                                  m=&source;

                                                  target=*m;

                                             }

 

 

(6)   ΤΕΛΕΣΤΗΣ ΧΡΟΝΟΥ ΜΕΤΑΦΡΑΣΗΣ (Compile-Time) sizeof

 

Είναι ένας τελεστής ο οποίος επιστρέφει το μέγεθος σε bytes μιας μεταβλητής ή ενός τύπου μεταβλητής που έχουμε σε παρένθεση.

 

            Π.χ.                             float f;

                                               printf(“%f”, sizeof f);                     Αυτό θα μας δείξει

                                               printf(“%d”, sizeof (int));                       4 και 2

 

            Σημειώνεται ότι για να υπολογιστεί το μέγεθος ενός τύπου πρέπει να περικλείεται το όνομα του τύπου σε παρενθέσεις. Αυτό δεν είναι απαραίτητο για ονόματα μεταβλητών.

 

            Κυρίως ο τελεστής sizeof χρησιμοποιείται για τον υπολογισμό του μεγέθους σύνθετων τύπων δεδομένων όπως records κτλ, βοηθάει επίσης στη μεταφερσιμότητα του κώδικα της C.

 

 

(7) ΤΕΛΕΣΤΗΣ   ,   (COMMA OPERATOR)

 

            Ο τελεστής     ,    χρησιμοποιείται στην ανανέωση διαφόρων εκφράσεων. Η αριστερή πλευρά του τελεστή πάντα χαρακτηρίζεται σαν void. Αυτό σημαίνει ότι η δεξιά πλευρά είναι αυτή που καθορίζει την τιμή της συνολικής έκφρασης.

                                                                  Π.χ.

                                                                  x = (y=3,  y+1);

 

            Πρώτα αποδίδουμε στο y την τιμή 3 και τέλος αποδίδουμε στο x την τιμή 4. Οι παρενθέσεις είναι απαραίτητες ενώ ο τελεστής    ,    έχει χαμηλότερη ιεράρχηση από το  =.

                                                                 y=10;

                                                                x=(y=y-5  ,  25/y);

 

            Μετά την εκτέλεση     ,   το x θα έχει την τιμή 5 επειδή η πραγματική τιμή του y μειώνεται κατά 5 και έπειτα διαιρεί το 25 σαν αποτέλεσμα.

 

            Ο τελεστής    ,   έχει την έννοια του “και” σε μία φράση της καθομιλουμένης, σα να λέμε “κάνε αυτό και αυτό”.

 

 

(8) ΤΕΛΕΣΤΗΣ   .   (DOT) ΚΑΙ -> (ARROW)

 

            Οι τελεστές   .   και ->  χρησιμοποιούνται για την αναφορά σε ατομικά στοιχεία structures και unions. Τα structures και τα unions είναι σύνθετοι τύποι δεδομένων οι οποίοι μπορούν να αναφερθούν με ένα μόνο όνομα.

 

            Ο τελεστής τελεία χρησιμοποιείται όταν η δομή ή το union είναι global ή όταν η δήλωσή τους είναι στο ίδιο τμήμα με τον κώδικα στον οποίο αναφέρονται. Ο τελεστής -> χρησιμοποιείται όταν έχουμε έναν pointer στη δομή ή το union.

            Π.χ.

            struct emp

            {

                        char name[80];

                        int age;

                        float wage;

            }

 

            Για να αποδώσουμε την τιμή 123.23 στο στοιχείο wage της δομής emp πρέπει να γράψουμε:

 

                                                                                                         emp.wage = 123.23;

 

 

(9) ΑΓΚΥΛΕΣ  [  ]  ΚΑΙ ΠΑΡΕΝΘΕΣΕΙΣ  (   )

 

            Στη C οι παρενθέσεις αυξάνουν την ιεραρχία των τελεστών που βρίσκονται μέσα τους.

 

            Οι αγκύλες ορίζουν δείκτες πινάκων. Όταν έχουμε πίνακα, η έκφραση μέσα στις αγκύλες μας δίνει τον δείκτη του πίνακα.

            Π.χ.

                                    char s[80];

                                    main( )

                                    {

                                         s[3] = ‘a’;

                                         printf(“%c”, s[3]);

                                    }

            Πρώτα δίνουμε την τιμή ‘a’ στο τέταρτο στοιχείο του πίνακα s μετά το τυπώνουμε. Υπόψη ότι στη C το πρώτο στοιχείο του πίνακα είναι το 0.

 

ΙΕΡΑΡΧΙΑ ΤΩΝ ΤΕΛΕΣΤΩΝ

 

Υψηλότερη                           ( )  [ ]  ->  .

                                             !  ~  ++ -(unary)  *  &  sizeof

                                             *  /  %

                                             +  -

                                             <<   >>

                                             <  <=  >  >=

                                             ==  !=

                                             &

                                             ^

                                            

                                             &&

                                            

                                             ?

                                             =  +=  -=  *=   /=

Χαμηλότερη                          )

 

 

ΕΚΦΡΑΣΕΙΣ

 

            Είναι ο συνδυασμός μεταξύ τελεστών και τελεστέων μέσα σε μία πρόταση.

           

            Τελεστές, σταθερές και μεταβλητές είναι τα συστατικά των εκφράσεων. Μία έκφραση στη C είναι κάθε σωστός συνδυασμός αυτών των πραγμάτων.

 

ΜΕΤΑΤΡΟΠΗ ΤΥΠΩΝ ΣΤΙΣ ΕΚΦΡΑΣΕΙΣ

 

            Όταν σταθερές και μεταβλητές διαφορετικών τύπων αναμιγνύονται σε μία έκφραση μετατρέπονται στον ίδιο τύπο. Η C μετατρέπει όλους τους τελεστέους στον τύπο του μεγαλύτερου τελεστέου.

            Οι κανόνες είναι:

1)      Όλοι οι char και short int μετατρέπονται σε int. Όλοι οι float σε double.

2)      Όλα τα ζεύγη τελεστέων μετατρέπονται σε long double αν ένας από αυτούς είναι long double.

Αλλιώς αν ένας είναι double, όλοι μετατρέπονται σε double.

Αλλιώς αν ένας είναι long, όλοι μετατρέπονται σε long.

Αλλιώς αν ένας είναι unsigned, όλοι μετατρέπονται σε unsigned.

 

            Εφόσον αναφέρθηκαν αυτοί οι κανόνες κάθε ζεύγος τελεστέων είναι του ίδιου τύπου και το αποτέλεσμα όλων των πράξεων είναι ίδιο με των τελεστέων.

 

            Στο παρακάτω παράδειγμα το ch γίνεται integer και το f μετατρέπεται σε double. Το ch/I γίνεται double γιατί το f * d είναι double και τέλος το όλο αποτέλεσμα είναι double.

 

            Η λογική της μετατροπής τύπων δεδομένων στην C είναι ότι η C μετατρέπει όλη την έκφραση στον τύπο του μεγαλύτερου τελεστέου. Εάν για παράδειγμα προσθέτουμε μία μεταβλητή τύπου char η όλη έκφραση θα μετατραπεί σε float.

 

            Π.χ.

                                             char ch;

                                             int i;

                                             float f;

                                             double d;

                              

            result =  (ch/ i)  + ( f  *  d )      ( f  +  d );

 

            η έκφραση ch/i θα επιστρέψει int, διότι ο τελεστέος I, είναι integer και άρα μεγαλύτερος (σε απαιτούμενο χώρο μνήμης) συγκριτικά με τον ch που είναι char.

            η έκφραση f*d θα επιστρέψει double.

            η έκφραση f+d θα επιστρέψει double.

 

            Άρα έχουμε : int + double – double.

 

            Όπως ήδη γνωρίζουμε οι εκφράσεις εκτελούνται από αριστερά προς τα δεξιά και ως εκ τούτου έχουμε :

 

            int + double = double, Έτσι η παραπάνω έκφραση διαμορφώνεται : doubledouble = double.

 

            Άρα η έκφραση επιστρέφει double.

 

 

 

CASTS

 

            Είναι δυνατό να αναγκάσουμε μία έκφραση να είναι ενός συγκεκριμένου τύπου χρησιμοποιώντας μία δομή η οποία ονομάζεται cast είναι:

(type) Expression

όπου type είναι ένας από τους standard τύπους της C.

Π.χ.      Αν θέλουμε να σιγουρέψουμε ότι η έκφραση x / 2 θα είναι τύπου float γράφουμε:

                                                ( float ) x / 2

            Συνήθως τα casts θεωρούνται τελεστές. Σαν τελεστές είναι μονοσήμαντοι και έχουν την ίδια θέση στην ιεραρχία με τους άλλους μονοσήμαντους τελεστές.

 

            Παρ’ όλα αυτά τα cast δε χρησιμοποιούνται και τόσο στον προγραμματισμό εκτός από λίγες περιπτώσεις που μπορούν να φανούν χρήσιμα.

 

            Π.χ.

                        main ( )

                        {

                            int i;

                            for (i = 1 ; i <= 100 ; ++i)

                            printf (“%d/2 is : %f”, i, (float) i/2);

                        }

 

            Στο παραπάνω παράδειγμα χρησιμοποιούμε τη μεταβλητή σαν δείκτη της for. Αυτή είναι int μεταβλητή. Όμως θέλουμε να την διαιρούμε δια 2 και να παίρνουμε και κλασματικό μέρος από την διαίρεση. Αν δεν είχαμε χρησιμοποιήσει cast θα είχαμε μία απλή ακέραια διαίρεση. Ενώ τώρα που ορίζουμε το αποτέλεσμα σαν float θα εκτυπωθεί και το δεκαδικό μέρος της διαίρεσης.

 

 

ΚΕΝΑ ΚΑΙ ΠΑΡΕΝΘΕΣΕΙΣ

 

            Τα κενά ανάμεσα σε εκφράσεις της C δεν έχουν κανένα αντίκτυπο.

            Π.χ.

                        x=10/y~(127/x);

                        x = 10 / y ~ ( 127 / x ) ;

Οι δύο αυτές εκφράσεις είναι ίδιες.

Οι παρενθέσεις πρέπει να χρησιμοποιούνται ακόμα και αν δεν χρειάζονται για να αυξάνουν την αναγνωσιμότητα του κώδικα. Δεν προκαλούν μείωση στην ταχύτητα.

 

 

ΣΥΝΤΟΜΟΓΡΑΦΙΕΣ (SHORTHAND) ΣΤΗ C

 

            Η C διαθέτει συντομογραφίες οι οποίες απλουστεύουν τον κώδικα.

            Π.χ. η έκφραση x=x+10; μπορεί να γραφτεί σαν x+=10;

            Το ζεύγος των τελεστών += οδηγεί τον compiler να αυξήσει το x κατά 10.

            Οι συντομογραφίες αυτές δουλεύουν για όλους τους δυαδικούς τελεστές της C. Η σύνταξη είναι:

                                    var = var  operator  expression

Είναι ίδιο με:                var operator = expression

 

Π.χ.:                 x=x-100;                    Π.χ.:               x=x+1;

                        x-=100;                                             x+=1;

                                                                                 x++