Τελεστές  & Λογικές/Αριθμητικές Εκφράσεις

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

Ο τελεστής καταχώρησης:

Για το τελεστή καταχώρησης (ή καλύτερα ανάθεσης σε μεταβλητή -assigment) χρησιμοποιείται το σύμβολο του ίσον (=) που έχει βέβαια διαφορετική έννοια απο ότι στα μαθηματικά. H εντολή:
                          var2 = 52;
 σημαίνει ότι δίνω την τιμή 52 στην μεταβλητή var2. Αν δώσω παρακάτω την εντολή: 
                        var2 = var2 +1;
που ενώ μαθηματικώς δεν "στέκει",  "αυξάνω" κατα μία μονάδα την τιμή που ήδη υπάρχει καταχωρημένη στην μεταβλητή var2, δηλαδή η νέα τιμή της var2 μετά την εκτέλεση της συγκεκριμένης εντολής θα είναι 53!

Φυσικά δεν μπορείτε να καταχωρήσετε τιμή σε μία σταθερά, ενώ στην C μπορώ να κάνω πολλαπλή καταχώρηση. Δηλαδή ισχύει το:
                         x=y=z=54; 
Εδώ οι καταχωρήσεις γίνονται από δεξιά προς τα αριστερά, δηλαδή πρώτα πάιρνει την τιμή 54 η μεταβλητή z, μετά η μεταβλητή y και τέλος η x.

 Οι αριθμητικοί τελεστές:

Προκειται για τους:

 

 Πρόσθεση

 

-

 

 Αφαίρεση

 

*

 

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

 

/

 

 Διαίρεση

 

%

 

 Υπόλοιπο  (πχ., 25 % 4 μας δίνει 1), καλείται  "modulo" και εφαρμόζεται μόνο σε ακεραίους.

 

Για κάθε τελεστή απαιτούνται 2 όροι (εκτός από τον τελεστή "-",  που είναι δυνατόν να χρησιμοποιηθεί και σαν πρόσημο), οι οποίοι μπορεί να είναι σταθερές ή μεταβλητές.
                      
ilikia=etos1 - etos2;
                       printf("%d", 95-55);
                       celsious=(-25);
Tα κενά διαστήματα δεν παίζουν ρόλο και μπορείτε να χρησιμοποιήστε  παρενθέσεις για μαθηματικές παραστάσεις:
                        result = -(b+2)*a + (c +3*(a-b);
Η C ακολουθεί την αλγεβρική προτεραιότητα στους αριθμητικούς τελεστές. Δηλαδή μεγαλύτερη προτεραιότητα έχουν οι παρενθέσεις, μετά το προσημο (δηλαδή το μείον), ακολουθούν ο πολλαπλασιασμός, η διαίρεση και το modulo και τέλος οι τελεστές πρόσθεσης και αφαίρεσης. Η εντολή καταχώρησης έχει μικρότερη προτεραιότητα από όλες τις πράξεις. Η φορά των πράξεων είναι από αριστερά προς δεξιά για όλους τους αριθμητικούς τελεστές, εκτός αν χρησιμοποιήστε το μείον σαν πρόσημο, οπότε η φορά είναι από δεξιά προς αριστερά!

Οι τελεστές συσχετισμού:

Τελεστές που τους χρησιμοποιούμε για την δημιουργία απλών λογικών εκφράσεων συσχετισμού (σύγκρισης). Αυτοί είναι: 

<

 

 Μικρότερο από (πχ. αν  i<j  επιστρέφει 1 αν το i είναι μικρότερο από το j)

 

>

 

 Μεγαλύτερο από

 

<=

 

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

 

>=

 

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

 

 = =

 

 Λογικό ισον

 

!=

 

 Διάφορο (όχι ίσο)

 

Το αποτέλεσμα μιάς λογικής έκφρασης είναι είτε 1 (αληθές) είτε 0 (ψευδές). Για παράδειγμα αν έχω x=2; και y=3; τότε η έκφραση (x > y) επιστρέφει 0. Οι λογικές εκφράσεις χρησιμοποιούνται σαν συνθήκες στις εντολές ελέγχου (και όχι μόνο). Προσέξτε το σύμβολο της ισότητας που είναι ένα διπλό ισον (= =)!  Επίσης θα πρέπει να γνωρίζετε ότι στην C η προτεραιότητα των τελεστών συσχέτισμού είναι μικρότερη από αυτή των αριθμητικών τελεστών, ενώ είναι μεγαλύτερη από αυτή του τελεστή καταχώρησης. Τι τιμή θα πάρει  η μεταβλητή i στο κώδικα που ακολουθεί;
             
      j = k =13;
                   i = j = = k;
Θα πάρει την  τιμή 1, διότι ο τελεστής της ισότητας (λογικό ίσον = =) έχει μεγαλύτερη προτεραιότητα από τον τελεστή καταχώρησης (ένα απλό ίσον =). Αρα λοιπόν, καθώς οι μεταβλητές  j και k είναι ίσες το αποτέλεσμα της σύγκρισης αυτών (j = = k) θα είναι αληθές, δηλαδή 1, τιμή που θα πάρει η μεταβλητή i. Ωραία πράγματα!

Οι λογικοί τελεστές:

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

&&

 

 Λογικό "και" (AND) μας επιστρέφει 1 αν και οι δύο operands είναι όχι μηδέν, διαφορετικά 0)

 

| | 

 

 Λογικό διαζευτικό "ή" (είτε - OR) 

 

!

 

 Λογική άρνηση (ΝΟΤ)

 

Το αποτέλεσμα μιάς έκφρασης με λογικούς τελεστές είναι  είτε μηδέν (ψευδές), είτε όχι μηδέν (αληθές). Με τους τελεστές && και | |, απαιτείται η χρήση 2 όρων, ενώ με τον τελεστή  !  ενός. 
                           ( x > 10 && x < 20)
Η προτεραιότητα των τελεστών συσχέτισμού είναι μεγαλύτερη από αυτή των λογικών τελεστών ενώ η προτεραιότητα και των δύο (συσχετισμού και λογικών) είναι μικρότερη από αυτή των αριθμητικών τελεστών! Γιά παράδειγμα η λογική έκφραση που ακολουθεί μας βρίσκει αν ένα έτος είναι δίσεκτο ή όχι: 
                         (etos % 4 = = 0 && etos % 100 != 0 | | etos % 400 = = 0)
Δίσεκτα έτη θεωρούνται όσα διαιρούνται ακριβώς με το 4 αλλά όχι με το 100. Εξαίρεση αποτελούν τα έτη που διαιρούνται ακριβώς με το 400, που θεωρούνται επίσης δίσεκτα. Αν το έτος λοιπόν είναι δεν είναι δίσεκτο τότε η λογική έκφραση επιστρέφει την τιμή 0 (ψευδής). Παρατηρείστε ότι η έκφραση που ακολουθεί, κάνει τήν ίδια δουλειά:
                        ( ! (etos % 4) && (etos % 100) | |  ! (etos % 400) )

Οι τελεστές επιπέδου bit:

Με την C μπορούμε να κάνουμε πράξεις σε επίπεδο bit με τους τελεστές:

<<

 

Ολίσθηση (shift) προς αριστερά. Για παράδειγμα η εντολή i << j  το i μετακινείται αριστερά j bits. Οι θέσεις των bits που αδειάζουν "γεμίζουν" με 0. Προσέξτε διότι δεν λαμβάνεται υπόψη το bit  του προσήμου!

 

>> 

 

 Ολίσθηση (shift) προς δεξιά. Αν η μεταβλητή είναι unsigned τότε τα κενά bits "γεμίζουν" με 0.  Αν η μεταβλητή έχει πρόσημο τότε τα bits που αδειάζουν, είτε παίρνουν το bit του προσήμου (0 ή 1 - θετική ή αρνητική μεταβλητή), είτε "γεμίζουν" με 0. Εξαρτάται από τον compiler...

 

~ Δυαδική άρνηση (όπου 1 μπαίνει 0 και όπου 0 μπαίνει 1 - one's complement). Υπάρχει ένας μόνο όρος


& Δυαδικό  "και" σε επίπεδο bit (συξευξη / AND). Δηλαδή η εντολή var = var & 0177, βάζει 0 σε όλα τα bits της μεταβλητής num, εκτός από τα 7 δεξιά bits αυτής. Προσέξτε ο τελεστής εδώ απαιτεί δύο όρους. Υπάρχει και ο τελεστής της διευθυνσης (&) με τον ίδιο συμβολισμό που όταν μπαίνει μπροστά σε μία μεταβλητή αναφέρεται στην διεύθυνση της.


|  Δυαδικό διαζευτικό "ή" σε επίπεδο bit (διάζευξη / OR). Η εντολή var  = var | ON, όπου υπάρχει 1 στις θέσεις των bits της ON, μπαίνει αντίστοιχα 1 στις θέσεις των  bits της var. 
  

^

 

 Αποκλειστική διάζευξη  "ή" (exclusive  OR) σε επίπεδο bit. Δηλαδή, η εντολή var1 ^ var2  στις θέσεις που τα bits  και των δύο μεταβλητών έχουν την ίδια τιμή μπαίνει 0, ενώ στις θέσεις που τα bits έχουν διαφορετική τιμή μπαίνει 1. 

 

Οι τελεστές αυξησης/μείωσης:

Πρόκειται γιά τους τελεστές:

+ +  που κάνει αύξηση μιας μεταβλητής κατά 1 μονάνδα π.χ  i++; 

- -  που κάνει μείωση μιας μεταβλητής κατά 1 π.χ  i-- ;

Εχει σημασία αν οι τελεστές αύξησης/μείωσης τεθούν πρίν (++i) ή μετά (i--) την μεταβλητή.  Στο πρόγραμμα που ακολουθεί:

#include <stdio.h>
main()
{
  int a=3, b=3;
  int syna, synb;
  syna=a++;
  synb=++b;
  printf ("a= %d, syna= %d, b= %d, synb=%d\n", a, syna, b, synb);

το αποτέλεσμα που θα πάρουμε από την εντολή printf θα είναι:
        a=4, syna=3, b=4, synb=4
και αυτό διότι στην εντολή  syna=a++; γίνεται χρήση της τιμής της μεταβλητής a, πριν γίνει η αύξηση κατά μία μονάδα, ενώ στην  synb=++b; μετά την αύξηση της μεταβλητής b κατά μία μονάδα. Επίσης η διαφορά μεταξύ των εντολών:
        alpha=beta*delta++ ;    (I)
  και 
       alpha=beta*++delta ;    (II)
είναι ότι στην (I) πρώτα πολλαπλασιάζεται η beta  με την delta και μετά αυξάνεται η delta κατά μία μονάδα, ενώ στην (II) πρώτα αυξάνεται η delta κατα μιά μονάδα και μετά πολλαπλασιάζεται με την beta.

Οι τελεστές εκχώρησης:

+=    Πρόσθεση σε μεταβλητή. Παράδειγμα:  x+=1; είναι το ιδίο όπως x=x+1

-=     Αφαίρεση από μεταβλητή. Παράδειγμα: x-=1; (όπως x=x-1)

*=    Πολλαπλασιασμός μεταβλητής. Παράδειγμα:  x*=3; (όπως x=x*3) 

/=     Διαίρεση μεταβλητής. Παράδειγμα:  x/=2; (όπως x=x/2)    

%=   Το υπόλοιπο. Παράδειγμα:  alpha %=2 (οπως alpha=alpha %2) 

>>=  Ολίσθηση δεξιά. Παράδειγμα: beta >>= 3 (τα bits της beta ολίσθησαν δεξιά κατα 3 θέσεις)

<<=  Ολίσθηση αριστερά. Παράδειγμα: beta <<= 3 (τα bits της beta ολίσθησαν αριστερά κατα 3 θέσεις)

&=   Σύζευξη (AND). Παράδειγμα:var &= 0177 (όπως var = var & 0177)

|=    Διάζευξη (OR). Παράδειγμα: var | = 0177

^=   Αποκλειστική διάζευξη  (exclusive  OR). Παράδειγμα:  var | = 0177

Ο τελεστής διευθυνσης (&):

Μας δίνει την διευθύνση της μνήμης που αποθηκευεται μιά μεταβλητή. Αν για παράδειγμα έχω μία ακέραια μεταβλητή ALPHA  ο συμβολισμός &ALPHA μας δίνει την διεύθυνση της μεταβλητής στην μνήμη. Ετσι αν η μετaβλητή ALPHA περιέχει τον αριθμό 32 (alpha=32) και αποθηκεύεται στην διεύθυνση  4294967246, τότε η εκτέλεση της εντολής:

printf ("Value of ALPHA:%d, Address of ALPHA:%u \n", ALPHA, &ALPHA); 

θα μας δώσει:

Value of ALPHA:32, Address of ALPHA:4294967246

Προσέξτε, για να εμφανιστεί σωστά η διεύθυνση χρησιμοποιήθηκε ο προσδιοριστής %u (χωρίς πρόσημο ακέραιος).

Ο τελεστής συνθήκης (?):

Γενική μορφή:   έκφραση ? εντολή-1 : εντολή-2

 Αν η (λογική) έκφραση είναι αληθής τότε αναπτύσσεται η εντολή-1, διαφορετικά αναπτύσσεται η εντολή-2. Ουσιαστικά πρόκειται για μία συμπαγής μορφή της εντολής if-else:

if (έκφραση) 

       εντολή-1

else 

       εντολή-2

 Για παράδειγμα  num = (x<=5) ? 1 : 0; Η μεταβλητή num θα πάρει την τιμή 1 αν το x είναι μικρότερο ή ίσο του 5, διαφορετικά θα πάρει την τιμή 0.

 

 Προτεραιότητες μεταξύ των τελεστών της C:

 

Ιεραρχία Τελεστές Φορά
1 ( )   [ ]  .   ->  Από αριστερά πρός δεξιά
2 !  ~  ++  --  &(διεύθυνση) *(indirection)  (type)  sizeof Από δεξιά πρός αριστερά
3 *(πολλαπλασιασμός)  /   % Από αριστερά πρός δεξιά
4 +   -  Από αριστερά πρός δεξιά
5 <<    >> Από αριστερά πρός δεξιά
6 <   <=   >   >= Από αριστερά πρός δεξιά
7 = =   !=  Από αριστερά πρός δεξιά
8 & (AND) Από αριστερά πρός δεξιά
9 Από αριστερά πρός δεξιά
10 Από αριστερά πρός δεξιά
11 && Από αριστερά πρός δεξιά
12 | | Από αριστερά πρός δεξιά
13 ?  :  Από δεξιά πρός αριστερά
14 =   +=   -=    *=    /=    %=   &=    ^=   |=   <<=   >>= Από δεξιά πρός αριστερά
15

,

Από αριστερά πρός δεξιά

 

 
Στην προηγούμενη ενότητα

Στην αρχική σελίδα

Στην επόμενη ενότητα

Κ.Βασιλάκης / ΤΕΙ Κρήτης